使用 Nokogiri 或任何 XML/HTML 解析器查找一个元素或一组元素的最大技巧是从一个简短的访问器开始,以进入您要查找的内容的大致区域,然后迭代地添加到它,随你去微调,直到你得到你想要的。
第二个技巧是记住使用// 来启动您的XPath,而不是/,除非您绝对确定要从文档的根目录开始。 // 就像 Linux 命令行中的 '**/*' 通配符。它到处搜索。
另外,不要相信浏览器提供的 XPath 或 CSS 访问器。他们对 HTML 源代码进行了各种修复,包括 tbody,就像您看到的那样。取而代之的是,使用 Ruby 的 OpenURI 或 curl 或 wget 检索原始源代码,并使用 vi 或 vim 之类的编辑器查看它,或者使用 less 或 cat 将其显示在屏幕上。这样就不可能对文件进行任何更改。
最后,使用 XPath 将搜索分解成块,然后让 Ruby 遍历事物,这通常比尝试提出更难维护或更脆弱的复杂 XPath 更容易/更快。
Nokogiri 本身非常简单。您要做的大部分事情都是两种不同方法的简单组合:search 和at。两者都采用 CSS 或 XPath 选择器。 search 及其兄弟方法xpath 和css 返回一个NodeSet,它基本上是一个可以迭代的节点数组。 at、css_at 和 xpath_at 返回与 CSS 或 XPath 访问器匹配的第一个节点。在所有这些方法中,...xpath 变体接受 XPath,...css 接受 CSS 访问器。
一旦你有了一个节点,通常你会想要对它做两件事之一,要么提取一个参数,要么获取它的文本/内容。您可以使用[attribute_to_get] 轻松获取属性,使用text 轻松获取文本。
使用这些方法,我们可以搜索页面中的所有链接并返回它们的文本和相关的href,使用类似:
require 'awesome_print'
require 'nokogiri'
require 'open-uri'
doc = Nokogiri::HTML(open('http://www.example.com'))
ap doc.search('a').map{ |a| [a['href'], a.text] }[0, 5]
哪些输出:
[
[0] [
[0] "/",
[1] ""
],
[1] [
[0] "/domains/",
[1] "Domains"
],
[2] [
[0] "/numbers/",
[1] "Numbers"
],
[3] [
[0] "/protocols/",
[1] "Protocols"
],
[4] [
[0] "/about/",
[1] "About IANA"
]
]