1

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

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链接保存到一个数组中,但是由于它们嵌套在每个数组中,因此无法访问它们。非常感谢任何帮助

4

3 回答 3

4

怎么样:

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

td这会直接在div带有 id的表中的列 ( ) 中选择任何深度的斜体链接mw-content-text,然后将它们映射到它们的href属性(即它们的链接值)。您可以更具体,具体取决于您要包含/排除的内容。

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

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']) }

更新:

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

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

这就是说:在 id 的 div 中找到所有表的子链接,mw-content-text其直接前面的兄弟有一个带有id“电影”的直接子跨度标签。稍微复杂一些。

于 2012-11-04T02:26:18.427 回答
0

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

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

您应该尽可能避免使用 xpath(恕我直言)

于 2012-11-04T02:39:26.590 回答
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
于 2012-11-04T02:46:30.603 回答