使用 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:--
山东济南
我正在尝试使用 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:--
山东济南