为什么不能从链接元素中检索URL格式的文本?

时间:2014-04-24 21:34:36

标签: ruby nokogiri

我正在解析一个RSS Feed,其中包含一个元素<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

4 个答案:

答案 0 :(得分:3)

您正在解析为HTML,但源是XML。在HTML the link element is empty中,Nokogiri解析与<link></link>http://example.com ...类似,其中url是link元素之外的文本节点。然后,当您查询解析的文档时,link元素为空。

要修复它,您应该解析为XML:

doc = Nokogiri::XML(open('http://www.kffl.com/printRSS.php/NFL-ARI'))
  # ...

答案 1 :(得分:0)

尝试获取该选择器返回的“first”项目的文本:

node.css('link').first.text # => "http://www.google.com/" 

答案 2 :(得分:0)

我不知道为什么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

答案 3 :(得分:0)

您可以使用.text?方法确定它是text node。和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-pup\n            "

我不知道为什么