【问题标题】:How do I use XPath in Nokogiri?如何在 Nokogiri 中使用 XPath?
【发布时间】:2011-01-06 01:14:43
【问题描述】:

我没有找到任何文档或教程。有这样的东西吗?


doc.xpath('//table/tbody[@id="threadbits_forum_251"]/tr')

上面的代码将在任何地方为我提供任何tbody 子级且属性id 等于“threadbits_forum_251”的table。但是为什么它以双//开头?为什么最后有/tr?详情请参阅“Ruby Nokogiri Parsing HTML table II”。


谁能告诉我如何使用 Nokogiri 提取 hrefidaltsrc 等?

td[3]/div[1]/a/text()' <--- extracts text

我怎样才能提取其他东西?

【问题讨论】:

    标签: ruby xpath nokogiri


    【解决方案1】:

    看来你需要阅读XPath Tutorial

    你的//table/tbody[@id="threadbits_forum_251"]/tr表达的意思是:

    • // - XML 文档中的任何位置
    • table/tbody - 获取一个带有 tbody 子元素的表格元素
    • [@id="threadbits_forum_251"] - where id 属性等于“threadbits_forum_251”
    • tr - 并取其 tr 元素

    所以,基本上,你需要知道:

    • 属性以@开头
    • 条件放在[] 括号内

    如果我正确理解该 API,您可以使用 doc.xpath("td[3]/div[1]/a")["href"],如果只有一个 &lt;a&gt; 元素,则可以使用 td[3]/div[1]/a/@href

    【讨论】:

    • @Rubens 谢谢。你是对的,我需要阅读 XPath 教程。我认为这是我需要阅读的 nokorigi 文档......如果我在 html 页面上单击并反对,是否有任何工具可以为我提供完整的 Xpath?
    • 我不知道,但 XPath 并不难;考虑您的文件系统,并假设每个文件夹都是 XML 元素;因此,当您选择 system32 文件夹时,您将获得 \windows\system32 路径;只需将\` 替换为/,考虑以@ 开头的属性和[] 开头的条件,就可以了
    • 我知道这是一个较旧的答案,但 xpath 教程的链接现在已损坏。我想现在应该是w3schools.com/xsl/xpath_intro.asp
    • 已修复,@Axiombadger !
    【解决方案2】:

    您的 XPath 是正确的,并且您似乎已经回答了您自己问题的第一部分(几乎):

    doc.xpath('//table/tbody[@id="threadbits_forum_251"]/tr')
    

    “上面的代码将为我提供任何 table 表的 tr,anywhere,其 tbody 子节点的属性 id 等于 threadbits_forum_251”


    // 表示以下元素可以出现在文档中的任何位置。

    /tr结尾表示,获取匹配元素的tr节点。

    您不需要逐个提取每个属性。只需在 Nokogiri 中获取包含所有四个属性的整个节点,然后使用以下方法获取属性:

    theNode['href']
    theNode['src']
    

    theNode 是您的 Nokogiri Node 对象。


    编辑:

    抱歉,我没有使用这些库,但我认为 XPath 评估和解析是由 Mechanize 完成的。以下是您如何一次性获取整个元素及其属性的方法。

    doc.xpath("td[3]/div[1]/a").each do |anchor|
        puts anchor['href']
        puts anchor['src']
        ...
    end
    

    【讨论】:

    • @Anurag 感谢您的精彩解释。我使用的是机械化而不是纯 nokogiri,我可以在 [:title, 'td[3]/div[1]/ 中以某种方式使用 theNode['href']一个/文本()'],?我想提取href而不是文本
    • [:address, 'td[3]/div[1]/a/@href'] ?
    • 我正在搜索 nokogiri 教程并找到了我自己的答案.. 呵呵 :)
    • Mechanize 内部使用 Nokogiri,所以它使用的是纯 Nokogiri,它只是在幕后。 Mechanize 的Mechanize::Page.parser 将解析页面的根作为 Nokogiri 文档返回。
    猜你喜欢
    • 1970-01-01
    • 2018-07-14
    • 1970-01-01
    • 1970-01-01
    • 2013-03-21
    • 1970-01-01
    • 1970-01-01
    • 2013-01-27
    • 1970-01-01
    相关资源
    最近更新 更多