您是否正在寻找在Python网络爬虫项目中使用的最佳HTML解析方法和工具?那么下面的文章就是为您而写,我比较了3个流行的HTML解析库。
能够规避检测以访问远程服务器上的网络资源并下载它只是网络爬虫的一个方面。出于明显的原因,这被认为是最难做到的。另一部分谜题也可能很困难,取决于页面元素的复杂性或者它们有多乱,那就是解析和提取所需数据。Python被誉为最简单易用的网络爬虫编程语言。
然而,其标准库中自带的HTML解析器却是使用起来最困难的选项之一。坦率地说,我几乎没有见过有人使用它。因此,在第三方库中提供了许多替代解析器供您选择使用。在本文中,我将推荐一些用于网络爬虫的最佳Python HTML解析库。
BeautifulSoup — 初学者友好的 HTML 解析器
BeautifulSoup 已经成为大多数初学者甚至一些高级用户事实上的 HTML 解析器。它是一个广泛使用的提取库,用于从 HTML 和 XML 文件中提取数据。关于 BeautifulSoup 您需要了解的一件事是,它甚至不是大多数人希望看到的解析。它基本上是一个提取工具,因为您需要定义您喜欢的抓取工具,或者它使用 HTML.Parser 解析库。所以基本上,它包装了一个解析器来为您提供数据提取支持。
然而,它受到人们的喜爱有两个主要原因。首先,您可以使用它从带有不正确标记的混乱网页中解析和提取数据,几乎没有问题。其次,它非常容易学习和使用,使其成为您在学习 Python 抓取时遇到并熟悉的第一个解析器。下面是如何使用它的代码。
import requests from bs4 import BeautifulSoup x = requests.get(“YOUR_WEB_TARGET”).content soup = BeautifulSoup(x) links = soup.find(“a”, {“class”: “internal_links”}) for i in links: print(I[“href”])
上面的代码将访问您选择的 URL,并收集类名为“internal_links”的所有 URL。
BeautifulSoup 的优点和缺点
优点:
- 初学者友好,具有良好的文档和大型社区支持
- 它甚至可以用来解析写得不好和格式错误的 HTML 或 XML 文档中的数据
- 提供多种数据提取方法,如select、find、find_all
缺点:
- 不是最快的之一,对于大型文档来说会变得相当慢
- 不支持 XPath 选择器 — 仅支持 CSS 选择器。
Lxml — 最快的 Python HTML 解析库
lxml 解析库是解析 HTML 和 XML 文档的另一个流行选项。与 BeautifulSoup 不同,BeautifulSoup 不是一个成熟的解析器,而是构建在解析器之上的,lxml 是一个成熟的解析器,如果您需要在 BeautifulSoup 中更快地解析和提取,您甚至可以使用它作为解析器。有趣的是,它也是一个独立的解析器,以其快速高效的解析引擎而闻名,这使其成为大型复杂项目的理想选择。与列表中的其他解析器相比,它成为快速解析器的原因在于,它实际上是作为两个 C 库(libxml2 和 libxsit)上的绑定库构建的,众所周知,这两个库在速度和内存效率方面进行了高度优化。
虽然众所周知,它对于大型且复杂的文档非常快速且有效,但您需要知道它并不是列表中最容易学习和使用的。事实上,它的学习曲线是列表中最陡的,而且它的用法相当复杂,这就是为什么大多数人不会将它用于更简单的任务。下面的代码展示了如何使用 lxml 解析库。
import requests from lxml import html url = “YOUR_SITE_TARGET” path = “*//*[@id=“pricing”] response = requests.get(url).content source_code = html.fromastring(response) tree = source_code.xpath(path) print(tree)
lxml 的优点和缺点
优点:
- 在速度和内存管理方面最有效
- 支持 CSS 选择器和 XPath
- 良好的文档
缺点:
- 难以学习且不适合初学者
Requests-HTML — 最适合解析动态网页
BeautifulSoup 和 lxml 虽然都非常适合解析,但它们都存在一个共同的主要问题。问题是它们缺乏对 Javascript 执行的支持。这意味着,如果您想抓取使用 Javascript 动态加载其内容的页面,那么这些工具将不适合抓取它们。然而,Requests-HTML 工具在这方面可以帮助您。它构建在 requests python 库之上,但使用 Chromium Web 浏览器,以便能够渲染 Javascript。
它不仅使用 Chromium 来渲染内容,还使用其 API 进行解析和提取。这个工具实际上很容易使用,并且支持 CSS 选择器和路径,这使得它们非常通用。下面的代码展示了如何使用Request=HTML来解析网页中的数据。
from requests_html import HTMLSession url = ‘YOUR_TARGET_WEBSITE’ session = HTMLSession() response = session.get(url) a_links = response.html.find(‘.internal_link’) for a in a_links: text = a_links.find(first=True).text print(text)
Requests的优点和缺点
优点:
- 支持Javascript动态内容的渲染和解析
- 简单易用且主动的API
- 良好的文档支持
缺点:
- 比其他提到的库慢得多
- Requests额外的依赖项
Python HTML 解析常见问题解答
问:Python 的最佳 HTML 解析库是什么?
由于需求各不相同,因此不存在适合所有用例的最佳 HTML 库,因此对于每个特定用例来说,最好的 HTML 库也是如此。如果您需要的是一个易于使用的解析器,仅用于常规页面和项目,那么 BeautifulSoup 是最好的。您甚至可以使用 lxml 作为其解析器以使其更快。对于那些需要处理复杂项目并且需要在空间(内存)和时间(速度)方面保持高效的人,那么 lxml 最适合他们。如果您正在处理使用 Javascript 渲染的动态网页,那么 Requests-HTML 是最好的。
问:解析 HTML 花时间吗?
在计算从 Web 抓取数据所需的时间时,从 HTML 解析和提取数据是您应该考虑的瓶颈之一。如前所述,lxml 是最快的,其次是 BeautifulSoup,然后是 requests-html。即使对于 lxml,如果您必须从数十万个页面中进行抓取,解析各个页面所花费的时间也会很快增加。所以,是的,解析确实需要时间,尤其是对于大型项目,这就是为什么您需要选择可用的最快解析器。
结 论
上述的3个库只是作为Python开发者进行网页抓取时可供选择的几个解析库之一。还有很多其他解析库,每个都有其优点和缺点。然而,上面提到的这些是最好且最受欢迎的,适用于特定用例。