我是XPath的新手,对我来说似乎有点棘手;有时候我发现它的工作方式不符合我的想法。
当我使用XPath和Nokogiri从网站上搜索数据时,如果网站结构复杂,我觉得很难。我使用FirePath来获取元素的XPath,但有时它似乎不起作用。我必须删除浏览器添加的额外标签,例如tbody
。
我真的想知道是否有一些很好的教程和XPath和Nokogiri的例子。谷歌搜索后我找不到多少。
答案 0 :(得分:14)
使用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"
]
]
答案 1 :(得分:8)
我还发现在开始时使用Nokogiri和XPath有一个相当陡峭的学习曲线,但经过大量的试验和错误后,我现在设法得到两者的挂起,所以挂在那里! Nokogiri非常强大,非常值得学习。
关于教程/示例,我假设您已经看过Nokogiri tutorials page。我可以想象,如果您不习惯XPath,XML解析等,那些教程的级别可能会有点高。
其他一些可能的资源:
在XPath上,我建议阅读this summary in five paragraphs。其核心XPath相当简单,只是非常不直观!我发现CSS更容易记住,我不认为我是唯一的。
但最后,虽然教程会有所帮助,但你可以做的最好的事情就是破解一个控制台,require 'nokogiri'
并开始插件。过了一会儿它才会开始变得有意义。
答案 2 :(得分:4)
我发现真正有用的最好的例子是在下面的链接中。它显示了不同的教程,您可以使用各种方法在xml文件中导航/查找信息时遇到越来越多的困难。
http://www.zvon.org/xxl/XPathTutorial/General/examples.html
希望你觉得它也很有用! 祝你好运!