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或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]
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)
我还发现在开始时使用Nokogiri和XPath有一个非常陡峭的学习曲线,但经过大量的试验和错误后,我现在设法得到两者的挂起,所以挂在那里!Nokogiri非常强大,非常值得学习.
关于教程/示例,我假设您已经看过Nokogiri 教程页面.我可以想象,如果您不习惯XPath,XML解析等,那些教程的级别可能会有点高.
其他一些可能的资源:
在XPath上,我建议在五个段落中阅读本摘要.其核心XPath相当简单,只是非常不直观!我发现CSS更容易记住,我不认为我是唯一的.
但最后,虽然教程会有所帮助,但你能做的最好的事情就是破解打开一个控制台,require 'nokogiri'然后开始插件.过了一会儿,它才会开始变得有意义.