XPath和nokogiri; 教程/例子吗?

K M*_*lam 5 xpath nokogiri scraper

我是XPath的新手,对我来说似乎有点棘手; 有时候我发现它的工作方式不符合我的想法.

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

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

the*_*Man 15

使用Nokogiri或任何XML/HTML解析器查找元素或元素组的最大诀窍是从一个简短的访问器开始,进入您正在寻找的一般附近,然后迭代添加到它,很好你去的时候,直到你拥有你想要的东西.

第二个技巧是记住用来//启动你的XPath,/除非你绝对确定要从文档的根目录开始.//就像'**/*'Linux中命令行的通配符一样.它到处搜索.

此外,不要相信浏览器提供的XPath或CSS访问器.他们对HTML源代码进行各种修正,包括tbody,就像你看到的那样.相反,使用Ruby的OpenURI或curlwget检索原始来源,看看它与像编辑vivim,或使用less或者cat它的屏幕.这样就不可能对文件进行任何更改.

最后,使用XPath将搜索分解为块更容易/更快,然后让Ruby迭代事物,而不是试图想出一个难以维护或更脆弱的复杂XPath.

Nokogiri本身很容易.你想要做的大多数事情是两种不同方法的简单组合:searchat.两者都采用CSS或XPath选择器.search,以及它的兄弟方法,xpathcss返回一个NodeSet,它基本上是一个可以迭代的节点数组.at,css_atxpath_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]
Run Code Online (Sandbox Code Playgroud)

哪个输出:

[
    [0] [
        [0] "/",
        [1] ""
    ],
    [1] [
        [0] "/domains/",
        [1] "Domains"
    ],
    [2] [
        [0] "/numbers/",
        [1] "Numbers"
    ],
    [3] [
        [0] "/protocols/",
        [1] "Protocols"
    ],
    [4] [
        [0] "/about/",
        [1] "About IANA"
    ]
]
Run Code Online (Sandbox Code Playgroud)


Chr*_*erg 9

我还发现在开始时使用Nokogiri和XPath有一个非常陡峭的学习曲线,但经过大量的试验和错误后,我现在设法得到两者的挂起,所以挂在那里!Nokogiri非常强大,非常值得学习.

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

其他一些可能的资源:

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

但最后,虽然教程会有所帮助,但你能做的最好的事情就是破解打开一个控制台,require 'nokogiri'然后开始插件.过了一会儿,它才会开始变得有意义.