我正在尝试创建一个功能,将从维基百科页面中删除演员的电影。这是代码的示例
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链接保存到一个数组中,但是因为它们嵌套在每个部分中而无法访问它们。任何帮助非常感谢
答案 0 :(得分:4)
怎么样:
doca.xpath('//div[@id="mw-content-text"]/table//td[2]//i/a').map { |a| a['href'] }
在td
内div
内直接位于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