【问题标题】:XPath along with nokogiri; tutorials/examples? [closed]XPath 和 nokogiri;教程/示例? [关闭]
【发布时间】:2012-10-25 14:05:12
【问题描述】:

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

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

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

【问题讨论】:

  • Nokogiri 的优点之一是它还支持 CSS 访问器。有时 CSS 是更快的解决方法,有时 XPath 是。如有必要,请随意互换使用它们。
  • 是的,我同时使用 css 选择器和 XPath。两者结合使用确实更强大。

标签: xpath nokogiri scraper


【解决方案1】:

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

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

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

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

Nokogiri 本身非常简单。您要做的大部分事情都是两种不同方法的简单组合:searchat。两者都采用 CSS 或 XPath 选择器。 search 及其兄弟方法xpathcss 返回一个NodeSet,它基本上是一个可以迭代的节点数组。 atcss_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]

哪些输出:

[
    [0] [
        [0] "/",
        [1] ""
    ],
    [1] [
        [0] "/domains/",
        [1] "Domains"
    ],
    [2] [
        [0] "/numbers/",
        [1] "Numbers"
    ],
    [3] [
        [0] "/protocols/",
        [1] "Protocols"
    ],
    [4] [
        [0] "/about/",
        [1] "About IANA"
    ]
]

【讨论】:

    【解决方案2】:

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

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

    其他一些可能的资源:

    在 XPath 上,我建议阅读 this summary in five paragraphs。 XPath 的核心是相当简单,只是非常不直观!我发现 CSS 更容易记住,而且我不认为我是唯一一个。

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

    【讨论】:

    猜你喜欢
    • 2013-03-08
    • 1970-01-01
    • 2011-01-18
    • 2011-06-26
    • 2012-11-14
    • 1970-01-01
    • 2013-01-09
    • 2015-05-28
    • 2011-04-18
    相关资源
    最近更新 更多