最佳Python HTML解析器列表

探索顶级的Python HTML解析器——Beautiful Soup、HTMLParser、lxml、PyQuery和Scrapy,以简化并加速您的网页抓取项目。
4 min read
最佳Python HTML解析器

由于有大量的HTML解析器可用,Python是网络爬虫的热门选择。在本文中,您将探讨最广泛使用的解析器:Beautiful SoupHTMLParserlxmlPyQueryScrapy。这些解析器因其易用性、速度、对现代HTML标准的支持、文档和社区支持而备受青睐。

让我们直接开始吧!

Beautiful Soup

Beautiful Soup是一个用于解析HTML和XML文档的Python库。它创建了一个与每个页面结构相对应的解析树,使得自动提取数据变得容易。该树代表了文档内元素的层次结构,允许您高效地导航和搜索,定位特定的节点。

功能和易用性

Beautiful Soup对于将HTML文档组织成结构化信息非常有用。它配备了各种解析器,包括html.parserlxmlhtml5lib,帮助您处理不同类型的标记,如标准HTML、格式不正确或损坏的HTML、XHTML、HTML5和XML。这使您可以灵活地选择速度和准确性之间的最佳平衡。例如,如果您正在处理一个缺少标签或元素嵌套不当的网页,您可以使用html5lib来解析HTML内容,就像浏览器一样。

当处理HTML结构不可预测或不组织的网页抓取任务时,Beautiful Soup也很有帮助。一旦文档被解析,您可以轻松地搜索树来定位节点。搜索方法如find()find_all()select()提供了基于标识符、类、文本内容或属性访问元素的方法。无论您是寻找某个标签的所有实例,还是定位一个元素,使用正确的选择器都能以最少的编码工作快速访问所需数据。

速度

Beautiful Soup不是最快的解析器,但它提供了灵活的解析策略,给予您适应性。默认情况下,它使用Python的html.parser,这对于处理小型文档以从博客文章中提取数据等简单任务是最好的。如果您想抓取和处理大量数据,考虑使用不同的解析器。

对最新HTML标准的支持

如果您想从静态网页中分析HTML5元素和属性,那么Beautiful Soup是一个很好的选择。它与解析器的兼容性保证了对最新HTML标准的遵从。

文档和支持

Beautiful Soup有着广泛的文档,并在GitHub上有超过85万用户。其文档提供了示例、教程和参考,使您容易上手。

这里了解更多关于使用Beautiful Soup进行网页抓取的信息。

代码示例

要安装Beautiful Soup,从您的shell或终端运行以下命令:

pip3 install beautifulsoup4

以下代码片段使用Beautiful Soup从Books to Scrape网站解析数据:

import requests
from bs4 import BeautifulSoup

# URL of the webpage to scrape
books_page_url = "https://books.toscrape.com/"

# Fetch the webpage content
response = requests.get(books_page_url)

# Check if the request was successful
if response.status_code == 200:
    # Parse the HTML content of the page
    soup_parser = BeautifulSoup(response.text, 'html.parser')

    # Find all articles that contain book information
    book_articles = soup_parser.find_all('article', class_='product_pod')

    # Loop through each book article and extract its title and price
    for book_article in book_articles:
        # Extract the title of the book
        book_name = book_article.h3.a['title']

        # Extract the price of the book
        book_cost = book_article.find('p', class_='price_color').text

        # Print the title and price of the book
        print(f"Title: {book_name}, Price: {book_cost}")
else:
    # Print an error message if the page could not be retrieved
    print("Failed to retrieve the webpage")

如果您想测试这段代码,将其保存在名为beautifulsoup_books_scrape.py的文件中,并使用以下命令运行:

python3 beautifulsoup_books_scrape.py

您应该会在终端或shell上看到第一页中所有书籍的标题和价格:

…output omitted…
Title: Soumission, Price:  £50.10
Title: Sharp Objects, Price:  £47.82
Title: Sapiens: A Brief History of Humankind, Price: £54.23
Title: The Requiem Red, Price: £22.65
Title: The Dirty Little Secrets of Getting Your Dream Job, Price: £33.34
…output omitted…

如果您是网页抓取的新手,Beautiful Soup的简单性和遍历HTML树的能力使其成为您的网页抓取项目的好选择。

HTMLParser

HTMLParser是一个Python自带的库,允许您解析和从HTML文档中提取数据。

功能和易用性

尽管HTMLParser缺少其他解析库如lxmlhtml5lib提供的一些功能,但HTMLParser的简单性和与Python的集成使其成为处理简单数据结构项目的良好选择,其中HTML内容是一致的(例如,抓取静态网页)。然而,如果您正在处理格式错误的HTML内容,那么HTMLParser并不是最佳选择。

速度

HTMLParser的速度足以满足大多数HTML解析的使用场景,其中您有小到中等大小的文档(即几千字节到几兆字节)和最小的预处理需求。然而,对于更复杂的HTML文档,建议使用像lxml这样的解析器。

对最新HTML标准的支持

HTMLParser支持基本的HTML解析,但在处理非常复杂或格式不佳的HTML文档时可能会遇到困难。此外,它并未完全支持最新的HTML5标准。

文档和支持

由于HTMLParser是Python标准库的一部分,它有可靠的文档和支持。您可以通过Stack Overflow、GitHub和与Python相关的论坛轻松找到帮助。

代码示例

如前所述,HTMLParser模块包含在Python标准库中,无需额外安装。

以下是使用html.parser解析HTML数据的代码示例:

from html.parser import HTMLParser

class MyHTMLParser(HTMLParser):
    def handle_starttag(self, tag, attrs):
        print("Encountered a start tag:", tag)

    def handle_endtag(self, tag):
        print("Encountered an end tag :", tag)

    def handle_data(self, data):
        print("Encountered some data  :", data)

parser = MyHTMLParser()

html_data = """
<html>
  <head><title>Example</title></head>
  <body><h1>Heading</h1><p>Paragraph.</p></body>
</html>
"""

parser.feed(html_data)

在这个脚本中,您扩展了HTMLParser类,创建了一个处理开始标签、结束标签并显示每个元素的HTML解析器。

要使用此代码,将其保存在名为htmlparser_example.py的文件中,并从您的终端或shell运行以下命令:

python3 htmlparser_example.py

输出将显示每个标签和数据:

…output omitted…
Encountered a start tag: html
Encountered some data  :

Encountered a start tag: head
Encountered a start tag: title
Encountered some data  : Example
Encountered an end tag : title
Encountered an end tag : head
…output omitted…

lxml

lxml是一个流行的网页抓取和数据提取选择,因为它将内置的XML库的强大功能与Python的易用性相结合。

功能和易用性

lxml因其高效且多功能的导航和分析HTML和XML文档的功能而受到欢迎。它提供了高级的XML处理功能,包括XPathXSLT和XPointer,允许您精确地提取和转换数据。

与Beautiful Soup一样,lxml支持树结构,使得导航和解析HTML内容变得容易。如果您处理多样化的内容,它在处理格式良好和格式不良的文档方面的能力可能会很有帮助。

速度

lxml以其速度和效率而闻名,因为它利用了C库,如libxml2libxslt。这使得lxml比其他解析库更快,尤其是在处理大型文档或复杂的解析任务时,例如从大型HTML表格中提取深度嵌套的数据。

对于时间紧迫的项目或需要处理大量数据的项目,lxml是一个很好的选择。

对最新HTML标准的支持

lxml可以处理最新的Web技术,包括HTML5文件和格式不佳的HTML。这使得lxml成为网页抓取任务的最佳选择之一,其中HTML的质量和结构可能会有所不同。

文档和支持

lxml拥有全面的文档,包含针对各级开发人员的详细示例。此外,您可以在Stack OverflowGitHub等平台上寻求更多信息、故障排除技巧和最佳实践。

这里了解更多关于使用lxml进行网页抓取的信息。

代码示例

要安装lxml,运行以下命令:

pip3 install lxml

以下示例向您展示如何使用lxml解析HTML数据:

from lxml import html

html_content = """
<html>
  <body>
    <h1>Hello, world!</h1>
    <p>This is a paragraph.</p>
  </body>
</html>
"""

tree = html.fromstring(html_content)

h1_text = tree.xpath('//h1/text()')[0]
print("H1 text:", h1_text)

p_text = tree.xpath('//p/text()')[0]
print("Paragraph text:", p_text)

在这里,您使用lxml解析HTML内容,然后使用XPath表达式从HTML元素中提取文本。

如果您想测试lxml,将此代码保存为名为lxml_example.py的文件,然后从您的shell或终端运行以下命令:

python3 lxml_example.py

您应该会看到从&lt;h1&gt;&lt;p&gt;元素中提取的文本,如下所示:

H1 text: Hello, world!
Paragraph text: This is a paragraph.

如果您需要一个成熟的、可用于生产环境的解析器,能够处理复杂的XPath查询(如XML中的类型或多个项目),您应该使用lxml。

PyQuery

PyQuery是一个类似于jQuery的Python库,可以让您在几秒钟内抓取整个网页。

功能和易用性

类似于jQuery语法,PyQuery对用户友好。您可以轻松选择元素,循环遍历它们,更新其内容,管理HTML属性。这在您想从HTML页面中提取数据并对其进行处理的任务中尤其有用,如网页抓取。

PyQuery还支持CSS选择器,如果您已经熟悉使用jQuery操作DOM文档,那么很容易上手。

速度

PyQuery使用lxml库进行HTML解析。这使得它易于使用,但比直接使用lxml要慢。

对最新HTML标准的支持

PyQuery符合最新的HTML5标准,并且由于使用lxml进行解析,PyQuery可以处理结构良好和结构不良的HTML。

文档和支持

PyQuery提供了详尽的文档,可以帮助您快速入门。虽然它的社区比其他库要小一些,但它由40多位贡献者积极支持。还有其他资源可用,如在线论坛、Stack Overflow和各种教程,可以帮助您解决问题。

代码示例

要安装PyQuery,运行以下命令:

pip3 install pyquery

这里是一个使用pyquery解析HTML数据的代码片段:

from pyquery import PyQuery as pq

html_content = """
<html>
  <body>
    <h1>Hello, from PyQuery!</h1>
    <p>This is a paragraph.</p>
  </body>
</html>
"""

doc = pq(html_content)

h1_text = doc('h1').text()
print("H1 text:", h1_text)

p_text = doc('p').text()
print("Paragraph text:", p_text)

在这个片段中,您解析HTML内容,然后从特定元素中提取文本。

将此代码保存为名为pyquery_example.py的文件,并使用以下命令从您的shell或终端运行:

python3 pyquery_example.py

您的输出如下所示:

H1 text: Hello, from PyQuery!
Paragraph text: This is a paragraph.

如果您已经了解如何使用jQuery并希望获得类似的功能,那么PyQuery是一个不错的选择。

Scrapy

Scrapy是一个灵活的开源网页抓取框架,使用户能够构建和运行爬虫来收集信息。它提供了处理抓取任务各个方面的工具,从管理HTTP请求到解析、处理和保存提取的数据。该框架处理了抓取任务中涉及的所有复杂性,使您可以专注于收集所需的信息。

功能和易用性

Scrapy旨在易于使用,并在解析复杂的网络数据方面表现出色,具有模块化的框架。它提供了XPath和CSS选择器用于导航HTML和XML,并包括诸如请求节流、用户代理欺骗和IP轮换等实用程序,这对于大型抓取非常重要。

速度

Scrapy效率很高。其网络功能允许您并发处理请求以执行数据检索。这在处理大型数据集或抓取商业网站时特别强大。

对最新HTML标准的支持

Scrapy支持HTML5标准,可以处理复杂的网站,甚至包含动态生成的JavaScript。虽然Scrapy本身不处理JavaScript,但它可以与Selenium等工具一起工作,处理JavaScript页面。

这里阅读更多关于如何抓取动态内容的信息。

文档和支持

Scrapy拥有大量的文档和活跃的社区支持。官方文档涵盖了您需要了解的所有基本用法和高级主题,并包括大量的示例、指南和推荐实践,支持各级开发人员。

此外,Scrapy社区通过论坛和GitHub存储库积极参与,确保您可以寻求帮助并获取您面临的任何问题的资源。

代码示例

要安装Scrapy,运行以下命令:

pip3 install scrapy

以下是使用Scrapy爬虫提取数据的示例:

import scrapy

class QuotesSpider(scrapy.Spider):
    name = "quotes"
    start_urls = [
        'http://quotes.toscrape.com/page/1/',
    ]

    def parse(self, response):
        for quote in response.css('div.quote'):
            yield {
                'text': quote.css('span.text::text').get(),
                'author': quote.css('small.author::text').get(),
                'tags': quote.css('div.tags a.tag::text').getall(),
            }

此脚本定义了一个爬虫类,设置了起始URL,并指定如何解析响应以提取数据。

将此代码保存在名为quotes_spider.py的文件中,并从您的终端或shell运行以下命令:

scrapy runspider quotes_spider.py -o quotes.json

当您执行此代码时,Scrapy会抓取Quotes to Scrape页面,并提取和解析该页面上的名言及其各自的作者和标签。然后,Scrapy将抓取的数据保存到一个quotes.json文件中,如下所示:

[
{"text": "\u201cThe world as we have created it is a process of our thinking. It cannot be changed without changing our thinking.\u201d", "author": "Albert Einstein", "tags": ["change", "deep-thoughts", "thinking", "world"]},
{"text": "\u201cIt is our choices, Harry, that show what we truly are, far more than our abilities.\u201d", "author": "J.K. Rowling", "tags": ["abilities", "choices"]}
…output omitted...
]

对于具有特定需求的复杂网页提取项目,Scrapy具有丰富的功能和可扩展性,是一个很好的选择。

结论

在本文中,您了解了五种Python的HTML解析器,包括Beautiful Soup、HTMLParser、lxml、PyQuery和Scrapy。

由于其简单性,Beautiful Soup非常适合初学者。HTMLParser是满足基本解析需求的轻量级选项。如果您正在寻找更好的性能和XPath支持,可以考虑lxml。PyQuery为Python带来了类似jQuery的简洁性。如果您正在处理大规模的抓取项目,Scrapy是要使用的框架。

想要跳过抓取并获取数据吗?立即注册并下载免费的样本,查看我们的数据集