返回博客
指南
苏丘·丹2023年2月2日阅读时长:12分钟

解析 HTML 和 XML 的 Ruby 库终极指南

解析 HTML 和 XML 的 Ruby 库终极指南

野切

Nokogiri是一个流行且功能强大的库,用于在 Ruby 中解析和搜索 XML 与 HTML 文档。它的 API 简洁明了,而且建立在 libxml2 的基础之上,后者是一个用于解析 XML 的成熟 C 库。

宝石指令

gem install 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

优点和缺点

以下是使用 Nokogiri 的一些利弊:

优点

  • 它被广泛认为是最流行、最常用的 Ruby 解析器
  • 由于它使用 libxml2 作为解析引擎,因此速度非常快,效率也很高。它可以轻松处理大型文档。
  • 它有一个简单和用户友好的应用程序接口,可以轻松浏览和搜索 XML 和 HTML 文档。
  • 它同时支持 XML 和 HTML 文档,因此可以使用同一个库来解析不同类型的文档。
  • 它有一套丰富的方法来搜索和操作文档中的元素,从而轻松提取所需信息。您可以使用 CSS 选择器或 XPath 提取数据。
  • 它可以解析畸形的 HTML 文档
  • 它与不同的 Ruby 版本兼容,并得到积极维护
  • 它还支持 SAX(Simple API for XML)和 DOM(Document Object Model)解析器

缺点

  • 有些解析任务可能需要深入了解 DOM 结构,如果开发人员不熟悉 DOM 结构,学习起来会很困难。
  • 与其他库(如 Ox)相比,它可能需要更多内存。
  • 它在解析受身份验证保护的文件时可能会遇到困难,例如需要用户名和密码才能访问的网站。
  • 它不是线程安全的,因此如果计划在多线程环境中使用,需要格外小心。
  • 它不适合通过 JavaScript 传递带有动态加载内容的文档,如 AJAX。

牛扒

Ox 或Optimized XML 是一个强大而高效的库,用于在 Ruby 中解析和处理 XML 和 JSON 文档。

该库采用 C 语言实现,具有更高的性能和内存效率。与基于 DOM 的解析器相比,Ox 使用拉动式解析器来解析文档,这使它能以更少的内存使用量解析大型文件。

Ox 处理 XML 文档的一些方法有

  • 作为通用的 XML 解析器和写入器:Ox 可以读写 XML 文档,提供搜索和操作文档中元素的方法。
  • 作为一个快速的 Object/XML Marshaller:Ox 可以将 XML 文档转换为 Ruby 对象,反之亦然。该功能可轻松实现数据序列化和反序列化。
  • 作为流 SAX 解析器Ox 能以流式方式解析 XML,适用于大型文件,并能快速处理 XML 事件。

宝石指令

gem install ox

代码样本

require "ox"

doc = Ox.parse(%{

  <?xml version="1.0"?>

  <Payment>

	<Shop>ikea</Shop>

	<Amount>199.99</Amount>

	<Date>2023-01-12</Date>

  </Payment>

})

puts doc.Payment.Shop.text

优点与缺点

以下是使用公牛的一些利弊:

优点

  • 由于 Ox 采用了拉取解析器方法,而且是用 C 语言实现的,因此速度非常快,内存效率也很高。这使它非常适合解析大型 XML 和 JSON 文档或处理流式数据
  • Ox 的应用程序接口简洁明了,易于使用和理解
  • Ox 同时支持 JSON 和 XML,因此您可以使用同一个库来解析不同类型的文档
  • 它内置了对 XML 命名空间的支持,可以更方便地处理带有命名空间的 XML 文档。
  • 积极维护和更新

缺点

  • 与 Nokogiri 或 REXML 等其他库相比,用于搜索和操作元素的 API 可能不够丰富。
  • 它的社区和支持可能不如像 Nokogiri 这样更成熟的图书馆那么强大

奥加

Oga 是一个现代化的轻量级库,用于在 Ruby 中解析和搜索 XML 与 HTML 文档。与其他库相比,它采用了更现代的方法,使用纯 Ruby 实现,这意味着它不依赖于任何 C 库。

该库适用于中小型文档,不需要 XSLT 或 XML Schema 验证等高级功能。

尽管该库不需要任何系统库(如 libxml),但为了获得更好的性能,Oga 使用了一个小的本地扩展(MRI/Rubinius 使用 C,JRuby 使用 Java)。

宝石指令

gem install oga

代码样本

require "oga"

doc = Oga.parse_xml(%{

  <?xml version="1.0"?>

  <Payment>

	<Shop>ikea</Shop>

	<Amount>199.99</Amount>

	<Date>2023-01-12</Date>

  </Payment>

})

puts doc.at_xpath("Payment/Shop/text()")

优点与缺点

以下是使用奥加的一些利弊:

优点

  • Oga 的应用程序接口简单明了,可轻松浏览和搜索 XML 和 HTML 文档。
  • 纯 Ruby 实现使其易于在不同平台和环境下安装和运行。
  • Oga 的应用程序接口允许在多线程环境中安全地解析和查询文档,而无需担心性能问题
  • Oga 重量轻,易于与其他库和模块集成。
  • 奥加的内存占用较低。

缺点

  • Oga 不支持 XPath、XSLT 或根据 DTD 或 XML 模式验证 XML 文档等高级功能。
  • 与 Nokogiri 等其他库相比,Oga 的功能有限,可能不适合复杂的 XML 或 HTML 解析任务。
  • 尽管对它进行了维护,但与 Nokogiri 相比,它得到的更新较少

LibXML Ruby

LibXML Ruby 是与 libxml2 C 库的绑定,后者是一个用于解析和处理 XML 文档的成熟库。该绑定为 libxml2 的功能提供了一个接口,包括 Nokogiri 在内的其他几个流行库也使用了它。

该库具有 XPath 支持、DTD 解析、XSL 转换高级功能。

宝石指令

gem install libxml-ruby

代码样本

require "xml"

doc = XML::Parser.string(%{

  <?xml version="1.0"?>

  <Payment>

	<Shop>ikea</Shop>

	<Amount>199.99</Amount>

	<Date>2023-01-12</Date>

  </Payment>

})

puts doc.parse.find('//Shop').first.content

优点与缺点

下面列出了它的优点和缺点:

优点

  • 得益于其底层 C 库,它为在 Ruby 中解析和处理 XML 和 HTML 文档提供了一种快速高效的方法。
  • 它支持多种编码类型,可处理具有复杂结构和命名空间的文档
  • 提供对 XPath 的支持,XPath 是一种允许你根据 XML 文档的属性和关系从文档中导航和选择元素的语言。
  • 支持 XSLT 转换和 DTD/XML 模式验证
  • 具有多种功能和选项,适合高级使用情况。
  • 它得到了社区的大力支持,是一个稳定且文档齐全的库。

缺点

  • 它可能比其他一些纯 Ruby 实现的库消耗更多内存
  • 该应用程序接口不像其他一些用于解析 XML 的 Ruby 库那样直观或用户友好,这可能会使经验不足的开发人员在使用时面临更大的挑战。
  • 它本身不支持 JSON 解析,需要额外的配置和工具来处理 JSON
  • 它处理畸形 XML 的能力可能不如其他一些库。

REXML

REXML 是一个用于解析 XML 文档的纯 Ruby 库,它包含在标准 Ruby 库中,因此使用方便,无需额外安装。

它的灵感来自 Java 的 Electric XML 库,具有易于使用的应用程序接口、体积小、速度快等特点。

宝石指令

gem install rexml

代码样本

require "rexml/document"

doc = REXML::Document.new(%{

  <?xml version="1.0"?>

  <Payment>

	<Shop>ikea</Shop>

	<Amount>199.99</Amount>

	<Date>2023-01-12</Date>

  </Payment>

})

doc.elements.each("//Shop"){ |element| puts element.text }

优点与缺点

优点

  • 它包含在标准 Ruby 库中,因此易于安装和使用。
  • REXML 是纯 Ruby,这意味着它不依赖于任何 C 语言库或外部依赖性,因此与平台无关。
  • 它的应用程序接口简单易用,是中小型 XML 文档的理想选择
  • 内置 XPath 实现,可轻松搜索和选择 XML 文档中的元素

缺点

  • REXML 的速度不如 Nokogiri 等其他库快,而且会消耗更多内存,因此不太适合大型 XML 文档。
  • 它缺乏其他 XML 库的一些高级功能,如处理 XML 命名空间或高级错误处理功能

Selenium Web 驱动程序

Selenium WebDriver 主要不是 HTML 或 XML 解析器,而是一种浏览器自动化工具。它允许你以编程方式与网络浏览器交互,模拟用户操作,如点击按钮、填写表格和在页面间导航。

Selenium WebDriver 可让您自动执行与网络浏览器的交互,如点击按钮、填写表格和在页面间导航。

如果您需要对使用 JavaScript 动态加载内容或执行特定操作(如与页面上的表单或按钮进行交互)的网站进行刮擦,该工具将非常有用。

宝石指令

gem install selenium-webdriver webdrivers

代码样本

require "selenium-webdriver"

require "webdrivers/chromedriver"

driver = Selenium::WebDriver.for :chrome

driver.get("https://webscrapingapi.com")

puts driver.title

优点与缺点

以下是在 Ruby 中使用 Selenium WebDriver 的一些利弊:

优点

  • Selenium WebDriver 支持多种网络浏览器,包括 Chrome、Firefox、Edge、Safari 等,这意味着您创建的测试无需修改即可在不同浏览器上运行。
  • Selenium WebDriver 提供了多种检查网页内容的方法,例如通过 ID、类名或 CSS 选择器来定位元素,从而轻松实现网页交互和任务自动化。
  • 它允许你与网页上的 javascript 元素进行交互,这一特性使其适用于使用 javascript 测试网页的行为。
  • 它在业内应用广泛,文档齐全,拥有一个庞大的开发人员社区,可以提供支持。

缺点

  • Selenium WebDriver 可能比其他 HTML 解析库更慢,因为它需要启动浏览器并模拟真实用户的交互,这可能会增加刮取数据所需的时间。
  • Selenium WebDriver 需要在机器上安装网络浏览器,这可能会导致在无头环境或无图形用户界面的服务器上运行脚本时出现问题。
  • Selenium WebDriver 并非专门的 HTML 解析库,其 API 可能不如 Nokogiri 或

值得一提

虽然我们重点关注的是在 Ruby 中解析 HTML 和 XML 的活跃且维护良好的库,但还有一些其他库值得考虑。

不过,需要注意的是,这些库的维护可能不那么积极,或者社区支持较少,如果在生产环境中使用,可能会增加额外的风险。

在做出决定之前,必须仔细评估库的功能和性能,以及需要解析的文档的大小和复杂程度。

Hpricot

Hpricot是另一款流行的 Ruby HTML 解析器,支持 XML 文档。Hpricot 的 API 简单易用,非常适合中小型文档。

宝石指令

gem install hpricot

代码样本

require "hpricot"

doc = "<!DOCTYPE html><html><head><title>Hello, World!</title></head><body>Hello, World!</body></html>"

puts Hpricot(doc).at("title").inner_html

优点与缺点

以下是使用 Hpricot 的一些利弊:

优点

  • Hpricot 的应用程序接口简单易用,可轻松浏览和搜索 HTML 和 XML 文档。
  • Hpricot 的搜索功能基于类似 jQuery 的 CSS 选择器,易于理解和使用。
  • 由于 Hpricot 的某些部分是用 C 语言编写的,因此该库的运行速度和效率相对较高
  • 适用于中小型文件
  • 与 Nokogiri 一样,它可以解析畸形文档

缺点

  • Hpricot 自 2010 年以来就没有进行过积极的维护,因此可能无法很好地与最新版本的 Ruby 配合使用,也可能缺乏对新功能和错误修复的支持。
  • Hpricot 的搜索功能不支持所有 CSS 选择器,也不支持 XML 命名空间。
  • 无法处理畸形的 XML 文档
  • 与其他库(如 Nokogiri 或 Ox)相比,Hpricot 的性能可能会慢一些,而且会消耗更多内存,尤其是对于较大的文档。

结论

总之,在 Ruby 中解析 HTML 和 XML 文档时,有多种库可供选择,它们各有利弊。

Nokogiri、REXML、Ox、Hpricot 和 LibXML Ruby 都是功能强大的库,可用于网络搜刮,但在决定使用哪个库之前,必须评估项目的具体要求和需要。

Selenium WebDriver 虽然并非主要为 HTML 解析而设计,但也可用于网络刮擦,不过它是一种浏览器自动化工具,与专门的库相比,会带来一些额外的复杂性和较慢的性能。

然而,构建网络刮擦脚本可能是一项耗时且困难的任务,尤其是当您需要处理动态网站、验证码和处理禁令时。

WebScrapingAPI 为从网页中获取数据提供了一个简单有效的解决方案,无需创建自己的脚本。使用提取规则功能,你可以通过指定元素的 CSS 选择器,轻松地从网页中获取信息。

为什么不今天就创建一个账户呢?

关于作者
Suciu Dan,WebScrapingAPI 联合创始人
Suciu Dan联合创始人

Suciu Dan 是 WebScrapingAPI 的联合创始人,他撰写了关于 Python 网络爬虫、Ruby 网络爬虫以及代理基础设施的实用指南,这些指南专为开发者而设计。

开始构建

准备好扩展您的数据收集规模了吗?

加入2,000多家企业,使用WebScrapingAPI在无需任何基础设施开销的情况下,以企业级规模提取网页数据。