0

HpricotとRubyを使用してHTMLファイルを解析しようとしていますが、のようなタグで囲まれていない「フリーフローティング」テキストの抽出に問題があります<p></p>

require 'hpricot'

text = <<SOME_TEXT
  <a href="http://www.somelink.com/foo/bar.html">Testing:</a><br />
  line 1<br />  
  line 2<br />
  line 3<br />
  line 4<br />
  line 5<br />
  <b>Here's some more text</b>
SOME_TEXT

parsed = Hpricot(text)

parsed = parsed.search('//a[@href="http://www.somelink.com/foo/bar.html"]').first.following_siblings
puts parsed

結果は次のようになると思います

<br />
line 1<br />  
line 2<br />
line 3<br />
line 4<br />
line 5<br />
<b>Here's some more text</b>

しかし、私は得ています

<br />
<br />
<br />
<br />
<br />
<br />
<b>Here's some more text</b>

Hpricotのリターンライン1、ライン2などを作成するにはどうすればよいですか?

4

2 に答える 2

1

最初のステップは、following_siblingsのドキュメントを読むことです。

現在の要素に続く兄弟要素を検索します。他の「兄弟」メソッドと同様に、これはテキストノードとコメントノードを取り除きます。

次に、Hpricotソースを使用して、コンテナ以外のノードのfollowing_siblingsように機能するものを取得するためにどのように機能するかを一般化する必要があります。following_siblings

parsed        = Hpricot(text)
link          = parsed.search('//a[@href="http://www.somelink.com/foo/bar.html"]').first
link_sibs     = link.parent.children
what_you_want = link_sibs[link_sibs.index(link) + 1 ... link_sibs.length]

puts what_you_want

following_siblingsこれは、のparent.children代わりにほとんど使用できparent.containersます。使用するライブラリのソースコードにアクセスできることは非常に便利であり、それを研究することをお勧めします。

于 2010-12-09T02:46:39.650 に答える
0

Hpricotを使用してからしばらく経ちましたが、次のことが役立つ可能性があることを覚えています。

すべてのテキストを取得する簡単な方法:

irb(main):023:0> print parsed.inner_text
  Testing:
  line 1  
  line 2
  line 3
  line 4
  line 5
  Here's some more text

その欠点は、テキストがタグに埋め込まれることです。

同様に、すべての'text()'ノードを検索できます。

irb(main):033:0> puts (parsed / 'text()')

Testing:

  line 1

  [...]

  line 5

したがって、これを行うことができます:

irb(main):036:0> puts (parsed / 'text()')[2 .. -3]

  line 1

  line 2

  line 3

  line 4

  line 5

また:

irb(main):037:0> (parsed / 'text()')[2 .. -3]
=> #<Hpricot::Elements["\n  line 1", "  \n  line 2", "\n  line 3", "\n  line 4", "\n  line 5", "\n  "]>

また:

irb(main):039:0> (parsed / 'text()')[2 .. -3].map{ |t| t.inner_text.strip }
=> ["line 1", "line 2", "line 3", "line 4", "line 5", ""]

Webページからデータ/テキストを取得するための主なアイデアは、ページ内を移動するために使用できるランドマークを探すことです。<div>多くの場合、または<p>タグ内からテキストを取得できます。ページにランドマークが表示されない場合は、他のトリックを使用する必要があります。一連のテキストノードとそれに続くノード、または特定の属性を持つタグに<br>続く5行を探します。それがHTMLを扱うことの楽しさと挑戦です。<a>href

私の心の奥には、これを行うためのよりエレガントな方法があるというしつこい考えがありますが、これは機能しているようです。コンテンツを掘り起こす際のテーマのバリエーションについては、Hpricotチャレンジページを調べてください。

于 2010-12-09T04:02:56.580 に答える