2015-06-07 62 views
1

我试图用Nokogiri刮html。 这是html源代码:用Nokogiri刮:: HTML - 无法从XPATH获取文本

<span id="J_WlAreaInfo" class="wl-areacon"> 
    <span id="J-From">山东济南</span> 
    至 
    <span id="J-To"> 
     <span id="J_WlAddressInfo" class="wl-addressinfo" title="全国"> 
      全国 
      <s></s> 
     </span> 
    </span> 
</span> 

我需要得到下面的文字:山东济南

经过与萤火虫最短XPATH:

//*[@id="J-From"] 

这里是我的Ruby代码:

doc = Nokogiri::HTML(open("http://foo.html"), "UTF-8") 
area = doc.xpath('//*[@id="J-From"]') 
puts area.text 

但是,它什么也没有返回。 我在做什么错?

+1

也许你可以给我们一个链接的网页?另外,你可以看看最初的页面源代码:可能是在页面加载后在JavaScript中创建'',但Nokogiri没有看到这样的东西? – LarsH

+0

你可能想看看在这里关于打开uri的顶级投票答案http://stackoverflow.com/questions/2572396/nokogiri-open-uri-and-unicode-characters – jvnill

+0

谢谢你们一千次,它是一个JS问题。 – Zoru

回答

2

但是,它什么也没有返回。我究竟做错了什么?

的XPath()返回一个包含匹配(它实际上所谓的节点集)数组:

require 'nokogiri' 


html = %q{ 
<span id="J_WlAreaInfo" class="wl-areacon"> 
    <span id="J-From">山东济南</span> 
    至 
    <span id="J-To"> 
     <span id="J_WlAddressInfo" class="wl-addressinfo" title="全国"> 
      全国 
      <s></s> 
     </span> 
    </span> 
</span> 
} 

doc = Nokogiri::HTML(html) 
target_tags = doc.xpath('//*[@id="J-From"]') 

target_tags.each do |target_tag| 
    puts target_tag.text 
end 

--output:-- 
山东济南 

编辑:实际上,你可以在阵列打电话text(),但它将返回的连接结果数组中的每个匹配的文本 - 这不是我曾经发现有用的 - 但因为只有一个匹配,你应该应该已经得到结果山东济南。您的帖子中没有任何内容表明您没有得到该结果的原因。

如果你只是想从你的XPath,即第一场比赛一个结果,那么你可以使用at_xpath()

target_tag = doc.at_xpath('//*[@id="J-From"]') 
puts target_tag.text 

--output:-- 
山东济南 
+0

我可以重现与OP相同的问题。我也收到一个空白字符串,所以它可能是一个本地机器问题。奇怪的是,nokogiri可以获得节点,但文本是空白字符串。 – jvnill

+0

@jvnill,证明它! – 7stud

+0

谢谢你的回答,问题出在JavaScript上。 Nokogiri什么也没有返回,因为那里什么都没有。 – Zoru