3

不適切な形式の html ページがあるとします。

<table>
 <thead>
  <th class="what_I_need">Super sweet text<th>
 </thead>
 <tr>
  <td>
    I also need this
  </td>
  <td>
    and this (all td's in this and subsequent tr's)
  </td>
 </tr>
 <tr>
   ...all td's here too
 </tr>
 <tr>
   ...all td's here too
 </tr>
</table>

<th>BeautifulSoup では、 を取得してから を呼び出すことができましたfindNext("td")。Nokogiri にはnext_element呼び出しがありますが、必要なものが返されない可能性があります (この場合、tr要素が返されます)。

next_elementノコギリの呼び出しをフィルタリングする方法はありますか? 例えばnext_element("td")

編集

明確にするために、私は多くのサイトを調べますが、それらのほとんどはさまざまな形で不適切に形成されています。

たとえば、次のサイトは次のようになります。

<table>
 <th class="what_I_need">Super sweet text<th>
 <tr>
  <td>
    I also need this
  </td>
  <td>
    and this (all td's in this and subsequent tr's)
  </td>
 </tr>
 <tr>
   ...all td's here too
 </tr>
 <tr>
   ...all td's here too
 </tr>
</table>

trクラスを持つアイテムの下に s がある以外の構造は想定できませんwhat_I_need

4

1 に答える 1

2

thまず、終了タグの形式が正しくないことに注意してください<th>。する必要があります</th>。役立つ修正。

thこれを行う1つの方法は、ノードが見つかったらXPathを使用してナビゲートすることです。

require 'nokogiri'

html = '
<table>
<thead>
  <th class="what_I_need">Super sweet text<th>
</thead>
<tr>
  <td>
    I also need this
  </td>
<tr>
</table>
'

doc = Nokogiri::HTML(html)

th = doc.at('th.what_I_need')
th.text # => "Super sweet text"
td = th.at('../../tr/td')
td.text # => "\n    I also need this\n  "

これは、CSSアクセサーまたはXPathのいずれかを使用するNokogiriの機能を利用しており、それを非常に透過的に実行します。

ノードを取得したら<th>、Nodeのいくつかのメソッドを使用してナビゲートすることもできます。

th.parent.next_element.at('td').text # => "\n    I also need this\n  "

それについて取り組むもう1つの方法は、テーブルの一番上から始めて見下ろすことです。

table = doc.at('table')
th = table.at('th')
th.text # => "Super sweet text"
td = table.at('td')
td.text # => "\n    I also need this\n  "

テーブル内のすべてのタグにアクセスする必要がある場合は<td>、それらを簡単に繰り返すことができます。

table.search('td').each do |td|
  # do something with the td...
  puts td.text
end

<td>含まれているすべてのコンテンツが行を反復処理するようにしたい場合は<tr>、セルを次のように入力します。

table.search('tr').each do |tr|
  cells = tr.search('td').map(&:text)
  # do something with all the cells
end    
于 2012-07-12T21:56:30.177 に答える