2

Deliciousからエクスポートされたリンクを含むhtmlファイルを解析したいと思います。構文解析にはノコギリを使用しています。このファイルの構造は次のとおりです。

<DT>
   <A HREF="http://mezzoblue.com/archives/2009/01/27/sprite_optim/"
      ADD_DATE="1233132422"
      PRIVATE="0"
      TAGS="irw_20">mezzoblue § Sprite Optimization</A>
<DT>
   <A HREF="http://datamining.typepad.com/data_mining/2008/11/minority-report-interface.html" 
      ADD_DATE="1226827542" 
      PRIVATE="0" 
      TAGS="irw_20">Minority Report Interface</A>
<DT>
   <A HREF="http://www.windowshop.com/" 
      ADD_DATE="1225267658" 
      PRIVATE="0" 
      TAGS="irw_20">Amazon Windowshop Beta</A>
<DD>Window shopping from Amazon

ご覧のとおり、リンク情報はDTタグにあり、一部のリンクにはDDタグにコメントがあります。

リンク情報を取得するには、次のようにします。

doc.xpath('//dt//a').each do |node|
  title = node.text
  url = node['href']
  tags = node['tags']
  puts "#{title}, #{url}, #{tags}"
end

私の質問は、ddタグが存在する場合、リンク情報とコメントを取得するにはどうすればよいですか?

4

3 に答える 3

3

私の質問は、dd タグが存在する場合にリンク情報とコメントを取得するにはどうすればよいですか?

使用:

//DT/a | //DT[a]/following-sibling::*[1][self::DD]

これによりaDT親を持つすべての要素と、子を持つDD要素の直後の兄弟要素であるすべての要素が選択されます。DTa

: の使用は、//通常、開発者の非効率性や異常につながるため、使用しないことを強くお勧めします。

XML ドキュメントの構造がわかっている場合は常に、//省略形を使用しないでください。

于 2010-12-18T17:53:26.387 に答える
2

あなたの質問は、あなたが探しているものについて明確ではありません。

まず、<DT>タグが正しく閉じられていないために HTML の形式が正しくなく、最初のaタグのテキストに、UTF-8 ではないために Ruby 1.9.2 が好まない不正な文字があります。TextMate で文字をエンティティに変換しました。

html = %{
<DT>
  <A HREF="http://mezzoblue.com/archives/2009/01/27/sprite_optim/" ADD_DATE="1233132422" PRIVATE="0" TAGS="irw_20">mezzoblue &sect; Sprite Optimization</A>
<DT>
  <A HREF="http://datamining.typepad.com/data_mining/2008/11/minority-report-interface.html" ADD_DATE="1226827542" PRIVATE="0" TAGS="irw_20">Minority Report Interface</A>
<DT>
  <A HREF="http://www.windowshop.com/" ADD_DATE="1225267658" PRIVATE="0" TAGS="irw_20">Amazon Windowshop Beta</A>
<DD>Window shopping from Amazon
}

その HTML は、修正を試みた後、Nokogiri でこれに解析されます。

(rdb:1) print doc.to_html
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">
<html><body>
<dt>
  <a href="http://mezzoblue.com/archives/2009/01/27/sprite_optim/" add_date="1233132422" private="0" tags="irw_20">mezzoblue § Sprite Optimization</a>
<dt>
  <a href="http://datamining.typepad.com/data_mining/2008/11/minority-report-interface.html" add_date="1226827542" private="0" tags="irw_20">Minority Report Interface</a>
<dt>
  <a href="http://www.windowshop.com/" add_date="1225267658" private="0" tags="irw_20">Amazon Windowshop Beta</a>
</dt>
</dt>
</dt>
<dd>Window shopping from Amazon
</dd>
</body></html>

終了タグが onlyタグdtの直前にグループ化されていることに注意してください。それは厄介ですが、コンテンツddを探す方法は変わらないので問題ありません。dd

doc = Nokogiri::HTML(html, nil, 'UTF-8')

comments = []
doc.css('dt + dd').each do |a|
  comments << a.text
end
puts comments

# >> Window shopping from Amazon

つまり、find の<dt>後に<dd>. dtその後をa検索しない/できないddのは、HTML が解析する方法ではないためです。実際には がdt続きます。ddこれが " dt + dd" の意味です。

aあなたの質問が読むことができるように見えた別の方法は、タグのコンテンツを探していたということでした:

comments = []
doc.css('a').each do |a|
  comments << a.text
end
puts comments

# >> mezzoblue § Sprite Optimization
# >> Minority Report Interface
# >> Amazon Windowshop Beta
于 2010-12-18T09:26:17.160 に答える
0

私は仮定しています:

<DD>Window shopping from Amazon

終了/DDタグがありますが、ページのスニペットだけではわかりません。もしそうなら、あなたはすることができます:

comment = node.parent.next_sibling.next_sibling.text rescue nil

最初の行は\n(改行)または空白に一致するため、next_siblingを2回呼び出す必要があります。二重呼び出しを回避するために、ページを解析する前にすべての新しい行を削除できます。DTタグの後に改行文字が複数ある場合にも、これは良い考えかもしれません。

于 2010-12-18T09:41:36.663 に答える