提取Nokogiri每个区域内的值

时间:2012-11-04 01:15:28

标签: ruby nokogiri

我正在尝试创建一个功能,将从维基百科页面中删除演员的电影。这是代码的示例

doca = Nokogiri::HTML(open("http://en.wikipedia.org/wiki/Kevin_Bacon"))

grandparent = doca.xpath('//div[@id="mw-content-text"]').children() 
child = []

grandparent.each {|node|
  node.children.each{|x|
    if x['id'] == "Films"
      child = node.next_element.children
      break
    end
  }
}

子数组的每个元素现在都包含一行影片表。我真正想要的是将每部电影的href链接保存到一个数组中,但是因为它们嵌套在每个部分中而无法访问它们。任何帮助非常感谢

3 个答案:

答案 0 :(得分:4)

怎么样:

doca.xpath('//div[@id="mw-content-text"]/table//td[2]//i/a').map { |a| a['href'] }

tddiv内直接位于mw-content-text内的列中的任意深度(href)处选择斜体链接,然后将其映射到url = "http://en.wikipedia.org/wiki/Kevin_Bacon" doca.xpath('//div[@id="mw-content-text"]/table//td[2]//a').map { |a| URI(url).merge(a['href']) } 属性(即它们的链接值)。您可以更具体,具体取决于您要包含/排除的内容。

如果您希望链接是绝对的而非相对的,则可以将页面URL合并到链接值:

doca.xpath('//div[@id="mw-content-text"]//table[preceding-sibling::*[1][span[@id="Films"]]]//a').map { |a| a['href'] }

更新:

或者,如果您想按照描述的方式搜索链接,可以这样做:

mw-content-text

这说明:在ID为id的div中查找作为表的子项的所有链接,其直接前导兄弟具有带{{1}}“Films”的直接子span标记。有点复杂。

答案 1 :(得分:0)

有更好的方法可以进入电影列表:

doca.at('span#Films').parent.search('+ table tr')[1..-1].each do |tr|
  puts tr.at('a')[:href] rescue 'N/A'
end

你应该尽可能避免使用xpath(imho)

答案 2 :(得分:0)

要获取/保存所有href链接,只需在给定代码中添加以下行:

hrefs = child.css('td a').map{|i| i.attributes['href'].value}
//puts hrefs

就是这样。因此,获取该表的所有href链接的整个代码片段:

doca = Nokogiri::HTML(open("http://en.wikipedia.org/wiki/Kevin_Bacon"))

grandparent = doca.xpath('//div[@id="mw-content-text"]').children() 
child = []

grandparent.each {|node|
  node.children.each{|x|
    if x['id'] == "Films"
      child = node.next_element.children
      break
    end
  }
}

hrefs = child.css('td a').map{|i| i.attributes['href'].value}
    //puts hrefs