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
  }
}

子配列の各要素には、フィルモグラフィテーブルの1行が含まれるようになりました。私が本当に望んでいるのは、各映画のhrefリンクを配列に保存することですが、それぞれの映画の中にうまくネストされているため、それらにアクセスするのに問題があります。どんな助けでも大歓迎

4

3 に答える 3

4

どうですか:

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

これは、 id を持つtdのすぐ内側のテーブルの列 ( ) 内の任意の深さでイタリック体のリンクを選択し、それらをその属性 (つまり、リンク値)にマップします。含める/除外するものに応じて、より具体的にすることができます。divmw-content-texthref

リンクを相対ではなく絶対にしたい場合は、ページの 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'] }

これは、 「Films」mw-content-textを含む直接の子スパン タグを持つ直接の先行兄弟を持つ id を持つ div 内のテーブルの子であるすべてのリンクを見つけることを意味します。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を避ける必要があります(imho)

于 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 に答える