HTMLドキュメント内の何かを見つけるために正規表現を使用せた後、バックlxmlののパワーを使用する取得するための最良の方法
-
19-09-2019 - |
質問
私は、HTMLドキュメント(数十万の中の数字)の多数のうちのいくつかのテキストをリッピングしようとしています。文書は本当に形であるが、それらは、文書を作成する方法に大きなばらつきがあるので、それらは異なる組織の非常に大規模なグループが用意されています。例えば、文書は章に分かれています。私はこの章の内容を分析することができますので、私はすべての文書から、第5章の内容を抽出したい場合があります。当初、私は、これは簡単だろうと思ったが、それは著者がその章のnは、テーブル内のtdタグを使用して表示することができるよう、コンテンツを保持するために、文書全体の非ネストされたテーブルのセットを使用する場合がありますことが判明しました。それとも彼らは、このようなPタグのHタグ、divタグまたは任意の他のブロックレベル要素として他の要素を使用する場合があります。
私は、各章の始めと終わりを識別するためにlxmlのを使用するために繰り返し試みた後、私は関係なく、外側のhtml要素は、章のラベルが何であるか、理由はすべての場合には、正規表現を使用しないために多くのクリーナーであると判断しています
の形で常にあります>Chapter #
これは、さまざまな方法(またはあるいは単にスペース)で表さいくつかの空白や改行なしスペースがあるかもしれません、もう少し複雑なものです。それにもかかわらず、各セクションの先頭を識別するための正規表現を記述するのは簡単でした。 (一つのセクションの始まりは、前のセクションの端部である。)
しかし、今、私はテキストを取得するためにlxmlのを使用したいです。私の考えは、私は本当に私は、関連するセクションを見つけるために使用していたテキストを囲む要素の終了タグを見つけるために私の列に沿って歩くざるを得ないということです。
これはここにある章名を保持している要素はdiv要素である一例です。
<div style="DISPLAY: block; MARGIN-LEFT: 0pt; TEXT-INDENT: 0pt; MARGIN-RIGHT: 0pt" align="left"><font style="DISPLAY: inline; FONT-WEIGHT: bold; FONT-SIZE: 10pt; FONT-FAMILY: Times New Roman">Chapter 1.   Our Beginnings.</font></div>
だから、私は見つけるために、私は1章に一致するものを見つけた場所から始まり、正規表現を設定するだろうと想像しています次の
</div|</td|</p|</h1 . . .
この時点で私は私の章の見出しを保持する要素の型を同定しているので、
私は私の
からマークを助けるために、正規表現を設定している要素内にあるテキストのすべてを見つけるために、同じロジックを使用することができます>Chapter 1.   Our Beginnings.<
私は私の第1章が始まる同定しているので、
I第2章のために同じことを行うことができる(ある場合、第1章終了)
今、私は、第1章が始まると場所を示す要素として識別要素の開口部から始まる文書を切り取るしようと思っていることを想像していますちょうど私が要素として識別要素の開始前に終了しています第2章が始まる場所を示します。私は、特定した文字列は、コンテンツを取得するためにその力を使用するlxmlのために供給されます。
HTMLドキュメントからコンテンツを抽出するために、正規表現を使ったことがないと私は開始を識別するためにlxmlのと同じように正確であると途中でヒットし、終了していない - 私は何度も読んだことがあるので、私はこのトラブルのすべてに行きます私が抽出したいテキストの場所。例えば、私は、第1章のサブタイトルは、それが私たちの赤いカナリア可能性が私たちの始まりであることを確信することはできません。私は、私は最初と最後の要素を持っていたし、私は正確であることができることを確信するためにlxmlのを試みる2つの固体日を過ごしたとしましょう。<時間が、非常に短い正規表現の60%は私に95%以上の成功を与えています。
私は誰が見てまたは同様の問題を解決した場合、私は疑問に思ってそう、彼らはアプローチを(ない詳細はあなたを気に)彼らが提供したいということ。持っていた場合は、
解決 3
私は特定し、私が必要なものを抽出するためにlxmlのを使用するための体系的な方法が存在しない恐れ通り。 O時間だけでなく、私は皆に鳴るに感謝しています。注意 - これはlxmlののせいではありません、それは一貫性のないHTMLコーディングの障害です。例えば。章では、1章のすべてのコンテンツは、要素のいくつかの種類に包まれるべき文書の合理的な部門ですので。おそらく最も柔軟性は、その後のdiv要素は次の章であることとdivタグになります。これは、章木の枝になるだろう。文書の約20%がそのうまく構造化される可能性があります残念ながら、一方で他の人はそうではありません。
私は私のコンテンツ(div要素、p)を保持しなければならない要素の種類ごとにテストし、私たちと私に警告情報を持っているそのタイプの次の要素に到達するまで、その兄弟の子のすべてとすべてをつかむことができセクション(次のセクションの先頭)の最後です。しかし、これは、私は正規表現との時間以上の優れた95%をしていたときにあまりにも多くの仕事のように思えます。
回答やコメントのすべてのおかげでは、いつものように、私は彼らからlearndedます。
他のヒント
時々、不十分または矛盾書かれたHTMLを扱う場合、コンテンツを取得するストレートパスがありません。
あなたはそれがあなたのコードの中にファイルに、またはパイプのいずれか、ページの内容をダンプするlynxやテキストベースのブラウザのいずれかを使用して、見たいし、それを処理することがあります。それとも、あなたがページをロードし、解析するlxmlのを使用することができ、その後、TEXT_CONTENTを使用してテキストを()を抽出し、正規表現を介して、各章の後に行くます。
彼らが言うように、GIGO - ごみで、ゴミ出し、それが金にそのゴミを回転させる開発者として、私たちの仕事です。そうすることで、かなり厄介取得することができます。
あなたはおそらく何ができるように聞こえる最も簡単な方法は、)(tree.getrootを反復される。iterdescendants()ご希望の正規表現に一致node.text
持つノードを探しています。その時点から、テキストがどこにあるかを決定するためにいくつかのアドホックヒューリスティックを使用する関数にノードを渡すことができます。 (たぶん、ルート上のiterdescendantsはあまりにもあなたがf(text_position) -> node
機能を試してみて、見つけることがetreeにあなたの正規表現のアプローチやダイビングを使用することができます遅い場合。)
//tr/td
だったことが判明した場合、たとえば、あなたはそれが理にかなってテキストを持っているかどうかを確認するために)node.parentの次のTD(に見えたいくつかのテーブルのテキスト発見サブルーチンに渡すことができます(約章長、特定の単語を含む、何でも)。同様に、あなたはdiv
とp
のような他のタグ内のデータを見つけるためのいくつかのヒューリスティックを作ることができます。あなたは、あなたがどのように処理するかを知っている何かを見つけるために、レベルの限られた数のバブルアップしようとすることができfont
のような未知のタグに自分自身を見つける場合 - あなたはあまりにも遠くないバブルまで慎重にする必要があり、または私はあなたが誤ってテキストを取得することがあります想像します別の章から。
問題の核心は、あなたがプログラム的な方法でプログラム提示していないデータをマイニングしていることのようです - 。これらのケースでは、人間の相互作用がある程度通常必要である。