使用 Nokogiri::HTML 抓取 - 无法从 XPATH 获取文本

Scraping with Nokogiri::HTML - Can't get text from XPATH

我正在尝试使用 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"]

这是我的 ruby 代码:

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

然而,它returns什么都没有。 我做错了什么?

However, it returns nothing. What am I doing wrong?

xpath() returns 一个包含匹配项的数组(它实际上称为 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(),但它会 return 数组中每个匹配项的文本的串联结果——这不是我曾经发现有用的东西 -- 但因为只有一个匹配,你 应该 得到结果 山东济南。您的 post 中没有任何内容表明您没有得到该结果的原因。

如果你只想从你的 xpath 中得到一个结果,即第一个匹配,那么你可以使用 at_xpath():

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

--output:--
山东济南