我正在尝试获取给定xpath的实际值。我在sample.rb文件中有以下代码
require 'rubygems'
require 'nokogiri'
require 'open-uri'
doc = Nokogiri::HTML(open('http://www.changebadtogood.com/'))
desc "Trying to get the value of given xapth"
task :sample do
begin
doc.xpath('//*[@id="view_more"]').each do |link|
puts link.content
end
rescue Exception => e
puts "error"
end
end
输出为:
查看更多问题
当我尝试获取其他不同XPath的值时,例如:/html/body/div[4]/div[3]/h1/span
然后我得到"error">消息。
我在野村试过这个。我不知道为什么这只会给几个XPath带来结果。
我在Hpricot也试过
http://hpricot.com/demonstrations
我粘贴我的url和XPath,然后看到
的结果//*[@id="view_more"]
作为
查看更多问题
[此文本出现在最近的问题标题的底部]
但它没有显示以下项的结果:/html/body/div[4]/div[3]/h1/span
对于这个XPath,我期望得到结果Bad
[这出现在http://www.changebadtogood.com/作为class="hero unit"div.]的第一个标头
您的问题与一个糟糕的XPath选择器有关,并且与Nokogiri或Hpricot无关。让我们调查一下:
irb:01:0> require 'nokogiri'; require 'open-uri'
#=> true
irb:02:0> doc = Nokogiri::HTML(open('http://www.changebadtogood.com/')); nil
#=> nil
irb:03:0> doc.xpath('//*[@id="view_more"]').each{ |link| puts link.content }
View more issues ..
#=> 0
irb:04:0> doc.at('#view_more').text # Simpler version of the above.
#=> "View more issues .."
irb:05:0> doc.xpath('/html/body/div[4]/div[3]/h1/span')
#=> []
irb:06:0> doc.xpath('/html/body/div[4]')
#=> []
irb:07:0> doc.xpath('/html/body/div').length
#=> 2
由此我们可以看出,只有两个div是<body>
元素的子元素,因此div[4]
无法选择一个。
看起来您正试图在此处选择跨度:
<h1 class="landing_page_title">
Change <span style='color: #808080;'>Bad</span> To Good
</h1>
与其依赖导致这种情况的脆弱标记(为元素的匿名层次结构建立索引(,不如使用文档的语义结构来获得更简单、更健壮的选择器。使用CSS或XPath语法:
irb:08:0> doc.at('h1.landing_page_title > span').text
#=> "Bad"
irb:09:0> doc.at_xpath('//h1[@class="landing_page_title"]/span').text
#=> "Bad"