【问题标题】:How to use Nokogiri's xpath and at_xpath methods如何使用 Nokogiri 的 xpath 和 at_xpath 方法
【发布时间】:2010-01-22 19:46:35
【问题描述】:

我正在学习如何使用 Nokogiri,根据这段代码,我遇到了几个问题:

require 'rubygems'
require 'mechanize'

post_agent = WWW::Mechanize.new
post_page = post_agent.get('http://www.vbulletin.org/forum/showthread.php?t=230708')

puts "\nabsolute path with tbody gives nil"
puts  post_page.parser.xpath('/html/body/div/div/div/div/div/table/tbody/tr/td/div[2]').xpath('text()').to_s.strip.inspect

puts "\n.at_xpath gives an empty string"
puts post_page.parser.at_xpath("//div[@id='posts']/div/table/tr/td/div[2]").at_xpath('text()').to_s.strip.inspect

puts "\ntwo lines solution with .at_xpath gives an empty string"
rows =   post_page.parser.xpath("//div[@id='posts']/div/table/tr/td/div[2]")
puts rows[0].at_xpath('text()').to_s.strip.inspect


puts
puts "two lines working code"
rows =   post_page.parser.xpath("//div[@id='posts']/div/table/tr/td/div[2]")
puts rows[0].xpath('text()').to_s.strip

puts "\none line working code"
puts post_page.parser.xpath("//div[@id='posts']/div/table/tr/td/div[2]")[0].xpath('text()').to_s.strip

puts "\nanother one line code"
puts post_page.parser.at_xpath("//div[@id='posts']/div/table/tr/td/div[2]").xpath('text()').to_s.strip

puts "\none line code with full path"
puts post_page.parser.xpath("/html/body/div/div/div/div/div/table/tr/td/div[2]")[0].xpath('text()').to_s.strip
  • 在 XPath 中使用 /// 更好吗? @AnthonyWJones 表示“使用不带前缀的 //”并不是一个好主意。
  • 我必须从任何工作的 XPath 中删除 tbody,否则我会得到 nil 结果。如何从 XPath 中删除元素以使事情正常工作?
  • 如果不使用完整的 XPath,我是否必须使用两次 xpath 来提取数据?
  • 为什么我不能让at_xpath 工作以提取数据?它在“How do I parse an HTML table with Nokogiri?”中运行良好。有什么区别?

【问题讨论】:

    标签: ruby xpath nokogiri


    【解决方案1】:
    1. // 表示每个级别的每个节点,因此与/ 相比,它的成本要高得多。
    2. 您可以使用* 作为占位符。
    3. 不,您可以进行 XPath 查询,获取元素,然后在节点上调用 Nokogiri 的 text 方法。
    4. 当然可以。看看“What is the absolutely cheapest way to select a child node in Nokogiri?”和我的基准文件。您将看到at_xpath 的示例。

    我发现你经常使用text() 表达式。使用 Nokogiri 不需要这样做。您可以检索该节点,然后在该节点上调用text 方法。它便宜得多。

    还要记住 Nokogiri 支持 CSS 选择器。如果您使用 HTML 页面,它们会更容易。

    【讨论】:

    • @Simone Carletti:谢谢你。也许我所有的问题都是因为我不知道如何阅读nokogiri.org 上的文档我不知道如何找到有关在节点上调用文本方法的任何信息。是否有可能写更多关于它的内容。我已经发现我的脚本有点慢,让它更快会很棒。
    • 我发现 XPath 占位符是一个真正的 xpath 表达式。那么使用 * 作为占位符是什么意思呢?
    • * 表示任何节点。例如,在/node/foo/one/node/bar/one 中,/node/*/one 匹配两个路径。
    • 你能告诉我如何使用文本方法吗?
    猜你喜欢
    • 2011-01-06
    • 1970-01-01
    • 1970-01-01
    • 2011-07-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-21
    相关资源
    最近更新 更多