由于有大量的HTML解析器可用,Python是网络爬虫的热门选择。在本文中,您将探讨最广泛使用的解析器:Beautiful Soup、HTMLParser、lxml、PyQuery和Scrapy。这些解析器因其易用性、速度、对现代HTML标准的支持、文档和社区支持而备受青睐。
让我们直接开始吧!
Beautiful Soup
Beautiful Soup是一个用于解析HTML和XML文档的Python库。它创建了一个与每个页面结构相对应的解析树,使得自动提取数据变得容易。该树代表了文档内元素的层次结构,允许您高效地导航和搜索,定位特定的节点。
功能和易用性
Beautiful Soup对于将HTML文档组织成结构化信息非常有用。它配备了各种解析器,包括html.parser
、lxml
和html5lib
,帮助您处理不同类型的标记,如标准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缺少其他解析库如lxml
和html5lib
提供的一些功能,但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处理功能,包括XPath、XSLT和XPointer,允许您精确地提取和转换数据。
与Beautiful Soup一样,lxml支持树结构,使得导航和解析HTML内容变得容易。如果您处理多样化的内容,它在处理格式良好和格式不良的文档方面的能力可能会很有帮助。
速度
lxml以其速度和效率而闻名,因为它利用了C库,如libxml2
和libxslt
。这使得lxml比其他解析库更快,尤其是在处理大型文档或复杂的解析任务时,例如从大型HTML表格中提取深度嵌套的数据。
对于时间紧迫的项目或需要处理大量数据的项目,lxml是一个很好的选择。
对最新HTML标准的支持
lxml可以处理最新的Web技术,包括HTML5文件和格式不佳的HTML。这使得lxml成为网页抓取任务的最佳选择之一,其中HTML的质量和结构可能会有所不同。
文档和支持
lxml拥有全面的文档,包含针对各级开发人员的详细示例。此外,您可以在Stack Overflow和GitHub等平台上寻求更多信息、故障排除技巧和最佳实践。
在这里了解更多关于使用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
您应该会看到从<h1>
和<p>
元素中提取的文本,如下所示:
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是要使用的框架。
想要跳过抓取并获取数据吗?立即注册并下载免费的样本,查看我们的数据集。