使用Nokogiri进行刮擦:: HTML - 无法从XPATH获取文本

时间:2015-06-07 03:07:02

标签: html ruby parsing xpath nokogiri

我正试图用Nokogiri抓取HTML。 这是html源代码:

<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> 

我需要获得以下文字:山东济南

用firebug检查最短的XPATH:

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

这是我的红宝石代码:

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

然而,它什么都不返回。 我做错了什么?

1 个答案:

答案 0 :(得分:2)

  

然而,它什么都不返回。我做错了什么?

xpath()返回一个包含匹配项的数组(它实际上称为NodeSet):

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:--
山东济南