创建数据解析器
一个优秀的数据解析器能够根据预定义的规则从 HTML 文档中提取相关信息,无论使用何种类型的解析器。解析过程主要包括两个步骤:词法分析和语法分析。
词法分析是指对文档中的单个词语和符号进行分析,并将它们分解为更小、更易于处理的单元。
这涉及词素化,即把文档分解为单个词素(如关键词、符号和数字)的过程。
让我们来看看这个简单的 HTML 文档:
<html>
<head>
<title>Scraping</title>
</head>
<body>
<h1>Welcome to my scraping page</h1>
<p>This is a paragraph.</p>
<ul>
<li>First Scraping Item</li>
<li>Second Scraping Item</li>
</ul>
</body>
</html>
词法分析过程会将该文档切分为诸如以下这些独立元素:
- `<html>`
- `<head>`
- `<title>`
- `抓取`
- `</title>`
- `<body>`
- `<h1>`
- `欢迎访问我的数据抓取页面`
- `</h1>`
- [...]
- `</body>`
- `</html>`
这样,HTML 文档中的每个元素都会被拆分为更小、更易于管理的片段,以便进行进一步的分析和处理。
句法分析是指分析文档结构并确定各个语法单元之间如何相互关联的过程。这包括识别数据中的模式和结构,并利用这些信息构建一种称为“句法树”的树状结构。
For example, the <html> tag is the root element, and it contains the <head> and <body> elements. Within the <head> element, there is a <title> element, and within the <body> element, there are <h1>, <p>, and <a> elements.
By identifying these elements and their relationships, you can construct a parse tree, with the <html> element as the root, <head> and <body> as its children, and so on.
You can use the parse tree to extract specific data from the HTML document, such as the text within the <title> element, or the href attribute of the <a> element.
最佳 HTML 解析库
在本节中,我们将探讨适用于不同编程语言的一些最流行的 HTML 解析库。这些库能够轻松地从 HTML 文档中提取结构化数据,是您开展网络爬虫项目的绝佳起点。
从 Python 的 Scrapy 和 BeautifulSoup,到 NodeJS 的 Cheerio 和 Java 的 JSoup,我们将逐一介绍这些库,并提供使用示例。
无论您是初学者还是经验丰富的开发者,本节内容都将帮助您深入了解在处理 HTML 数据时可用的各种选项。
开始吧!
加油
Scrapy 和 BeautifulSoup
Scrapy和BeautifulSoup是用于 Python 网页抓取的库。
Scrapy 是一个功能强大的网络爬虫框架,它允许您通过选择器或 XPath 表达式从网站中提取结构化数据。
以下是一个基本的Scrapy示例:
import scrapy
class QuotesSpider(scrapy.Spider):
name = "quotes"
def start_requests(self):
urls = [
'https://quotes.toscrape.com/page/1/',
'https://quotes.toscrape.com/page/2/',
]
for url in urls:
yield scrapy.Request(url=url, callback=self.parse)
def parse(self, response):
page = response.url.split("/")[-2]
filename = f'quotes-{page}.html'
with open(filename, 'wb') as f:
f.write(response.body)
self.log(f'Saved file {filename}')
您可以使用以下命令运行该代码:
Scrapy 爬取报价
BeautifulSoup 是一个库,它允许您像网页浏览器那样解析 HTML 和 XML 文档,并从中提取数据。
以下是一个简单的 BeautifulSoup 实现:
from bs4 import BeautifulSoup
html_doc = """<html><head><title>Scraper</title></head>
<body>
<h1 class="title">Hello, World!</h1>
</body>"""
soup = BeautifulSoup(html_doc, 'html.parser')
print(soup.title.string)
这两个库都提供了简单便捷的 API,用于遍历、搜索和修改网页内容,非常适合用于网页抓取项目。
JSoup
如果您选择的编程语言是 Java,那么JSoup是一款数据解析器,它提供了一个便捷的 API,用于提取和处理数据,并融合了 DOM、CSS 以及类似 jQuery 的方法的精华。
这使您能够通过简单直观的 API 来解析和浏览 HTML 文档,并修改文档内容。该库非常适合用于网页抓取、网页爬取和数据提取项目。
以下是一个使用 JSoup 从 title 标签中提取文本的简单实现:
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
public class JSoupExample {
public static void main(String[] args) {
String html = "<html><head><title>Example Title</title></head>"
+ "<body>Hello, World!</body></html>";
Document doc = Jsoup.parse(html);
// Get the title of the document
String title = doc.title();
System.out.println("Title: " + title);
}
}野切
Nokogiri 是一个 Ruby 库,它为解析和搜索 XML 及 HTML 文档提供了易于使用的接口,并支持 XPath 和 CSS 选择器,因此常被用于网页抓取和数据提取任务。
如需更全面地了解 Ruby 生态系统中的数据解析库,您可以阅读这篇文章。
使用以下命令安装 nokogiri gem:
gem install nokogiri
下面的代码示例是一个简单的 nokogiri 实现:
require "nokogiri"
html = "<!DOCTYPE html><html><head><title>Hello, World!</title></head><body>Hello, World!</body></html>"
parsed_data = Nokogiri::HTML.parse(html)
puts parsed_data.title正则表达式
正则表达式(也称为regex)是一种用于匹配字符串中模式的强大工具。它们常用于文本处理任务,例如在文档中进行搜索、验证和提取信息。
您可以使用正则表达式通过搜索特定模式来从 HTML 中提取信息,例如从 HTML 文档中提取电子邮件地址或标题。
例如,要从一个 HTML 文档中提取所有 URL,可以使用以下正则表达式:
/https?:\/\/[\w\.-]+\.[a-z]+/gi
该表达式将匹配以“http”或“https”开头、后跟冒号和两个斜杠,接着是任意组合的单词字符、点号和连字符,最后以点号和一个或多个小写字母结尾的字符串。“gi”标志表示进行全局搜索且不区分大小写。
使用正则表达式可能会有些棘手,因为其语法较为复杂,而且要精确地写出正确的模式往往需要经过一番试错。此外,还有一些网站(如Regex101或Rubular)可以帮助你测试和调试正则表达式。
如果你不想使用现成的库或正则表达式,随时可以自己构建解析器。
亲手构建解析器不仅能帮助你更深入地理解所处理的数据,而且当现有库或工具无法满足你的特定需求时,这也是一种不错的选择。
构建解析器
构建解析器虽然是一项具有挑战性的任务,但也充满成就感。构建解析器的过程涉及制定一套规则和指令,用于规定数据如何被解析和组织。
您可以通过多种技术实现这一点,例如正则表达式、状态机和递归下降解析。
在构建解析器时,必须对数据的结构和格式有透彻的理解,才能为解析器设计出一套合适的规则和指令。选择合适的编程语言也是一个重要的考量因素。
自建解析器的优势之一在于,您可以根据具体数据和用例对其进行定制。与使用通用库或工具相比,这往往能带来更高效、更有效的解析器。
此外,构建自己的解析器也是一次极好的学习经历,因为这能让你更深入地理解数据解析背后的概念和技术。
从头开始构建解析器也存在一些缺点:
- 设计和实现这一功能可能既费时又费力,特别是如果你对解析算法和数据结构不熟悉的话。
- 要让您的解析器达到与那些经过性能优化的现有库或工具同样的性能水平,可能颇具挑战。
- 如果数据格式或结构发生变化,随着时间的推移,维护和更新解析器可能会变得很困难。
- 在代码中进行调试或查找错误可能比较困难,特别是如果你对解析过程不熟悉的话。
- 这可能会导致错误和漏洞,从而使解析器无法按预期工作。
- 对于复杂的语法分析,要实现所有规则和边界情况可能比较困难。
- 它可能不如现有的库和工具高效,因为后者经过了优化,并且已被许多人使用。
总而言之,从头开始构建自定义解析器存在诸多弊端,例如开发周期长、维护成本高以及出错风险大。通常建议使用现有的库或工具,或者在它们能够满足具体用例要求的情况下使用正则表达式。
Schema.org 元数据
解析 schema.org 元数据是一种利用网络架构标准从网页中提取结构化数据的方法。schema.org 背后的社区负责管理这些标准,并推动在网络上使用架构来处理结构化数据。
解析模式元数据在许多方面都很有用,例如查找活动更新信息,或供研究人员收集研究数据。此外,那些聚合数据的网站,如房产信息、招聘信息和天气预报网站,也能从解析模式数据中获益。
您可以使用多种格式的架构,包括 JSON-LD、RDFa 和 Microdata。
JSON-LD(链接数据的 JavaScript 对象表示法)是一种使用 JSON 编码链接数据的格式。该标准的设计既便于人类阅读和编写,也便于机器进行解析和生成。
以下是一篇关于某本书的网页的 JSON-LD 示例:
<script type="application/ld+json">
{
"@context": "http://schema.org",
"@type": "Book",
"name": "The Adventures of Tom Sawyer",
"author": "Mark Twain",
"datePublished": "1876-12-01",
"description": "The Adventures of Tom Sawyer is a novel about a young boy growing up along the Mississippi River in the mid-1800s. It is a classic of American literature and has been loved by generations of readers.",
"publisher": "Penguin Books",
"image": "https://www.example.com/images/tom_sawyer.jpg"
}
</script>
万维网联盟(W3C)的建议标准是RDFa(即“属性中的资源描述框架”),用于在XML和HTML中嵌入RDF语句。
下面展示了 RDFa 在 HTML 页面中的呈现形式。您可以注意到,标签属性是如何被用来存储额外数据的。
<!DOCTYPE html>
<html>
<head>
<title>RDFa Example</title>
</head>
<body>
<div about="http://example.com/books/the-great-gatsby" typeof="schema:Book">
<h1 property="schema:name">The Great Gatsby</h1>
<div property="schema:author" typeof="schema:Person">
<span property="schema:name">F. Scott Fitzgerald</span>
</div>
<div property="schema:review" typeof="schema:Review">
<span property="schema:author" typeof="schema:Person">
<span property="schema:name">John Doe</span>
</span>
<span property="schema:reviewBody">
A classic novel that explores themes of wealth, love, and the decline of the American Dream.
</span>
<span property="schema:ratingValue">4.5</span>
</div>
</div>
</body>
</html>
微数据(Microdata)是 WHATWG 制定的一项 HTML 规范,用于在网页现有内容中嵌套元数据,并可使用 schema.org 或自定义词汇表。
以下是一个 HTML 中微数据的示例:
<div itemscope itemtype="http://schema.org/Product">
<span itemprop="name">Shiny new gadget</span>
<img itemprop="image" src="shinygadget.jpg" alt="A shiny new gadget" />
<div itemprop="offerDetails" itemscope itemtype="http://schema.org/Offer">
<span itemprop="price">$19.99</span>
<link itemprop="availability" href="http://schema.org/InStock" />
</div>
</div>
目前有许多工具可用于解析不同语言的架构,例如 Zyte 的Extruct和RDFLib库,这些工具使得利用 Web 架构标准从网页中提取结构化数据变得轻而易举。
高级解析器
到目前为止,我们讨论了数据解析的基础知识,包括词法分析和语法分析的基本概念。我们还探讨了各种用于数据解析的开源库、正则表达式的应用、从零开始构建解析器,以及使用 schema.org 进行数据解析。
您可以随时依赖 WebScrapingAPI、SERP API或Amazon API 这样的网页解析工具。这些网页解析工具让您能够实时抓取数据,无需担心维护、编码或基础设施问题。
使用高级网页解析器有以下几个优势:
- 可靠性:与容易出现漏洞和错误的免费或开源替代方案相比,Web 解析器通常更加稳定可靠。
- 速度:Web 解析器经过速度和性能优化,可让您快速高效地提取数据。
- 可扩展性:Web 解析器能够处理海量数据和高流量,因此非常适合用于大规模的网页抓取和数据提取项目。
- 高级功能:Web 爬虫通常包含各种高级功能,例如 IP 轮换、用户代理伪造和验证码破解,这些功能可帮助您绕过反爬虫措施并访问被屏蔽的网站。
- 技术支持与维护:Web 解析器提供客户支持及定期软件更新,确保您能够使用最新的功能和错误修复。
但说实话:高级网页解析器并非只有优点。以下是一些缺点:
- 成本:与开源选项相比,高级网页解析工具的成本可能更高
- 定制化程度有限:与自行开发解析器相比,付费网络解析器的功能可能较为有限
- 对服务的依赖:如果服务中断或出现任何问题,可能会影响您解析数据的能力
- 对数据的控制有限:使用高级网页解析器时,您对可访问和处理的数据的控制可能较少
- 受供应商数据源的限制:高级网页解析器提供的数据质量和相关性可能会受到供应商数据源的限制。




