5

我是 XPath 的新手,对我来说似乎有点棘手;有时我发现它并没有按照我认为它应该工作的方式工作。

当我使用 XPath 和 Nokogiri 从网站上抓取数据时,如果网站结构复杂,我会觉得很困难。我使用 FirePath 来获取元素的 XPath,但有时它似乎不起作用。我必须删除浏览器添加的额外标签,例如tbody.

我真的很想知道是否有一些很好的 XPath 和 Nokogiri 教程和示例。谷歌搜索后我找不到太多。

4

2 回答 2

15

使用 Nokogiri 或任何 XML/HTML 解析器查找一个元素或一组元素的最大技巧是从一个简短的访问器开始,以进入您要查找的内容的大致区域,然后迭代地添加它,很好- 随心所欲地调整,直到你拥有你想要的。

第二个技巧是记住使用//XPath 启动,而不是/,除非您绝对确定要从文档的根目录启动。//就像'**/*'Linux 命令行中的通配符。它到处搜索。

此外,不要相信浏览器提供的 XPath 或 CSS 访问器。他们对 HTML 源代码进行了各种修复,包括tbody,就像您看到的那样。取而代之的是,使用 Ruby 的 OpenURI or curlor来检索原始源代码,并使用类似orwget的编辑器查看它,或者使用or将其显示在屏幕上。以这种方式不可能对文件进行任何更改。vivimlesscat

最后,使用 XPath 将搜索分解成块,然后让 Ruby 遍历事物通常比尝试提出更难维护或更脆弱的复杂 XPath 更容易/更快。

Nokogiri 本身很容易。您要做的大部分事情都是两种不同方法的简单组合:searchat. 两者都采用 CSS 或 XPath 选择器。search,以及它的兄弟方法xpathcss,返回 a NodeSet,它基本上是一个可以迭代的节点数组。atcss_atxpath_at返回与 CSS 或 XPath 访问器匹配的第一个节点。在所有这些方法中,...xpath变体接受 XPath,而变体接受...cssCSS 访问器。

一旦你有了一个节点,通常你会想要对它做两件事之一,要么提取一个参数,要么获取它的文本/内容。您可以使用 轻松获取属性[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"
    ]
]
于 2012-10-26T02:03:33.430 回答
9

我还发现一开始使用 Nokogiri 和 XPath 的学习曲线非常陡峭,但是经过大量的试验和错误后,我现在已经掌握了两者的窍门,所以坚持下去!Nokogiri 真的很强大,值得学习。

关于教程/示例,我假设您已经看过 Nokogiri教程页面。我可以想象,如果你不习惯 XPath、XML 解析等,这些教程的水平可能会有点高。

其他一些可能的资源:

在 XPath 上,我建议分五段阅读此摘要。XPath 的核心是相当简单,只是非常不直观!我发现 CSS 更容易记住,而且我不认为我是唯一一个。

但最后,虽然教程会有所帮助,但你能做的最好的事情就是打开一个控制台,require 'nokogiri'然后开始插电。一段时间后,它就会开始变得有意义。

于 2012-10-25T14:29:52.780 回答