Java使用HTMLParser组件解析HTML文档

版权申诉
0 下载量 22 浏览量 更新于2024-10-19 收藏 33KB RAR 举报
资源摘要信息:"HTML解析器是用于解析HTML文档的Java库。HTML是一种标记语言,用于在网页上显示文本和图形。HTML文档通常包括各种标签,这些标签定义了文档的结构和内容。HTML解析器可以读取HTML文档,并根据其标签和属性构建一个对象模型。" HTML解析器的工作原理是读取HTML文档,然后根据其标签和属性,将文档转换为一个对象模型。这个对象模型可以被进一步用于各种目的,如数据提取、数据验证、数据修改等。 HTML解析器通常使用两种解析方法:DOM解析和SAX解析。DOM解析器会将整个HTML文档读入内存,并构建一个树状的结构,这个结构可以被进一步用于各种操作。SAX解析器则采用事件驱动的方式,逐个读取HTML文档的标签和属性,然后进行相应的处理。SAX解析器的效率更高,但它的灵活性较差。 Java中的HTML解析器有很多种,例如Jsoup、HtmlCleaner、HtmlUnit等。这些解析器都有各自的特点和优势,开发者可以根据实际需要选择合适的解析器。 HTML解析器的应用非常广泛,例如网络爬虫、网页抓取、网页自动化测试、网页内容提取等。通过使用HTML解析器,开发者可以更方便地处理HTML文档,提高开发效率。 在Java中使用HTML解析器,首先需要引入相应的库。以Jsoup为例,可以在项目中引入Jsoup库,然后使用Jsoup的API来解析HTML文档。例如,可以使用Jsoup.connect(url).get()方法来获取指定URL的HTML文档,然后使用Jsoup.parse(html)方法来解析HTML文档。 总的来说,HTML解析器是Java中处理HTML文档的一个重要工具。通过使用HTML解析器,开发者可以更方便地处理HTML文档,提高开发效率。

import requestsfrom html.parser import HTMLParserimport argparsefrom concurrent.futures import ThreadPoolExecutor, ProcessPoolExecutor, as_completedimport multiprocessingprefix = "save/"readed_path = multiprocessing.Manager().Queue()cur_path = multiprocessing.Manager().Queue()new_path = multiprocessing.Manager().Queue()lock = multiprocessing.Lock()class MyHttpParser(HTMLParser): def __init__(self): super().__init__() self.tag = [] self.href = "" self.txt = "" def handle_starttag(self, tag, attrs): self.tag.append(tag) if tag == "a": for att in attrs: if att[0] == 'href': self.href = att[1] def handle_endtag(self, tag): if tag == "a" and len(self.tag) > 2 and self.tag[-2] == "div": print("in div, link txt is %s ." % self.txt) print("in div, link url is %s ." % self.href) if not self.href in readed_path.queue: readed_path.put(self.href) new_path.put(self.href) self.tag.pop(-1) def handle_data(self, data): if len(self.tag) >= 1 and self.tag[-1] == "a": self.txt = datadef LoadHtml(path, file_path): if len(file_path) == 0: file_path = "/" url = f"http://{path}{file_path}" try: response = requests.get(url) print(response.status_code, response.reason, response.raw.version) data = response.content.decode("utf-8") if response.status_code == 301: data = response.headers["Location"] if not data in readed_path.queue: new_path.put(data) data = "" return data except Exception as e: print(e.args)def ParseArgs(): parser = argparse.ArgumentParser() parser.add_argument("-p", "--path", help="domain name") parser.add_argument("-d", "--deep", type=int, help="recursion depth") args = parser.parse_args() return argsdef formatPath(path): path = path.removeprefix("https://") path = path.removeprefix("http://") path = path.removeprefix("//") return pathdef doWork(path): path = formatPath(path) m = path.find("/") if m == -1: m = len(path) data = LoadHtml(path[:m], path[m:]) with open(prefix + path[:m] + ".html", "w+", encoding="utf-8") as f: f.write(data) parse.feed(data)def work(maxdeep): args = ParseArgs() cur_path.put(formatPath(args.path)) readed_path.put(formatPath(args.path)) parse = MyHttpParser() with ProcessPoolExecutor(max_workers=4) as executor: for i in range(args.deep): size = cur_path.qsize() futures = [executor.submit(doWork, cur_path.get()) for _ in range(size)] for future in as_completed(futures): try: future.result() except Exception as e: print(e) cur_path.queue.clear() while not new_path.empty(): cur_path.put(new_path.get()) print(i)if __name__ == '__main__': work(5)此代码出现Unresolved reference 'parse'

2023-06-03 上传