我正在解析一个RSS提要,该提要中有一个元素<link>
,其中有一个url,比如<link>http://www.google.com/</link>
;但是,当我尝试使用node.css('link').text
获取url时,它会返回一个空字符串。我应该访问另一个属性吗?
我正在使用nokogiri/ruby。
示例:
doc = Nokogiri::HTML(open('http://www.kffl.com/printRSS.php/NFL-ARI'))
doc.css('item').each do |item|
puts item.css('link').text
puts item.css('link').first.text
end
您正在解析为HTML,但源代码是XML。在HTML中,link
元素是空的,因此Nokogiri将其解析为类似<link></link>http://example.com ...
的内容,其中url是link
元素之外的文本节点。然后查询解析后的文档时,link
元素为空。
要修复它,您应该解析为XML:
doc = Nokogiri::XML(open('http://www.kffl.com/printRSS.php/NFL-ARI'))
# ...
尝试获取该选择器返回的"第一个"项目的文本:
node.css('link').first.text # => "http://www.google.com/"
我不知道为什么Nokogiri不识别这里的链接,但在这种情况下,xpath总是会来拯救:
doc = Nokogiri::HTML(open('http://www.kffl.com/printRSS.php/NFL-ARI'))
doc.css('item').each do |item|
puts item.xpath("//item['link']/text()").text
end
您可以使用.text?方法来确定它是一个文本节点。和next方法来获取文本(获取下一个元素)。
doc = Nokogiri::HTML(open('http://www.kffl.com/printRSS.php/NFL-ARI'))
doc.css('item')[0].css('link').first.text?
# => false
doc.css('item')[0].css('link').first.next.text?
# => true
doc.css('item')[0].css('link').first.next.text
# => "http://www.kffl.com/gnews.php?id=901900-cardinals-tyrann-mathieu-expected-to-start-camp-on-pupn "
我不知道为什么