1

廃棄目的で正規表現ジェネレーターを作成しようとしていますが、ガイダンスをいただければ幸いです。

アイデアは、大きなテキスト (html) があり、常に類似している 2 つの (少なくとも) DOM 要素 (Google からの最初の 2 つの結果など) を選択し、これをスクレイピング (一致) する正規表現を生成する必要があるということです。結果。

例: 選択された要素 1 (これはユーザーによって入力されます):

<a onmousedown="return rwt(this,'','','','1','AFQjCNHqQo9TrXtXXM5lDpiCmNQO9xwkhw','','0CGoQFjAA',null,event)" class="l" href="http://www.miniclip.com/"><em>Games</em> at Miniclip.com - Play Free Online <em>Games</em></a>

選択された要素 2 (これはユーザーによって入力されます):

<a onmousedown="return rwt(this,'','','','2','AFQjCNGlNySkvcXMxEUmjCMOJRQPCdqBHQ','','0CHIQFjAB',null,event)" class="l" href="http://www.games.com/"><em>Games</em>.com: Play <em>Games</em> Online - Free <em>Games</em>, Download <em>Games</em> <b>...</b></a>

両方の要素を含む HTML テキスト:

<ol id="rso" eid="GcrGT_KHH4f3sgbXmci5Cw"><!--m--><li class="g"><div sig="U8P" bved="0CBUQkQo" pved="0CBQQkgowAA" class="vsc"><h3 class="r"><a onmousedown="return rwt(this,'','','','1','AFQjCNHqQo9TrXtXXM5lDpiCmNQO9xwkhw','','0CGoQFjAA',null,event)" class="l" href="http://www.miniclip.com/"><em>Games</em> at Miniclip.com - Play Free Online <em>Games</em></a></h3><div class="vspib" aria-label="Detalii rezultat" role="button" tabindex="0">

</div></div></div><!--n--></li><!--m--><li class="g"><div sig="fUe" bved="0CBsQkQo" pved="0CBoQkgowAQ" class="vsc"><h3 class="r"><a onmousedown="return rwt(this,'','','','2','AFQjCNGlNySkvcXMxEUmjCMOJRQPCdqBHQ','','0CHIQFjAB',null,event)" class="l" href="http://www.games.com/"><em>Games</em>.com: Play <em>Games</em> Online - Free <em>Games</em>, Download <em>Games</em> <b>...</b></a></h3><div class="vspib" aria-label="Detalii rezultat" role="button" tabindex="0">

この場合、適切な正規表現は次のようになります。

(<h3 class="r">)(.*?)(</h3><div)

理解するのは難しくありません。問題<h3 class="r">は、結果に関係のない別の要素に表示される場合に表示されます。たとえば、次のように追加した場合:

<h3 class="r">THIS IS JUST AN EXTRA THING</h3> 

HTML テキストの開始時に、上記の正規表現は機能しません。

新しい正規表現は次のようにする必要があります。

(class="vsc"><h3 class="r">)(.*?)(</h3><div)

これを達成するのは簡単なことではありませんが、私の考えは、要素の類似点を見つけることです (たとえば、要素の前後に 100 文字を取り、要素 1/要素 2 の同一性を確認します)。

これを達成するための最良の方法について、誰かが私を案内してくれることを願っています。

前もって感謝します

4

1 に答える 1

0

私が質問を正しく理解している場合、最初に必要なのは、特定の文字列(およびいくつかのコンテキスト)が与えられた場合に、特定の文字列に最適に適合する正規表現を返すものです。Regulazytxt2reを含むいくつかのオプションがあるようです。

次に必要なのは、親を探しているため、DOMをトラバースする機能です(たとえば、例で2つのリンクが指定されている場合、周囲のh3を検索します)。正規表現を介してこれを試みることはできますが、それは困難であり、すべてのエッジケースを適切に処理できない可能性があります。XMLに準拠していないHTMLの修正と、結果のDOMのトラバースの両方に使用できるあらゆる種類のツールがあります。たとえば、先日、NekoHTMLを使用してJavaでこれを実行していました。

その時点で、次のようなアルゴリズムを適用できます。

  1. 指定された2つのノード間の最初の共通の親を見つけます。
  2. 親のテキストコンテンツから正規表現を作成します。
  3. 最上位のhtmlノードのコンテンツに正規表現を適用します。
  4. 複数の一致が得られた場合(ダブルh3の場合)、親の親にズームアウトします。
  5. 新しい親で手順2から始めて、すすぎ、繰り返します。

秘密のソースは明らかに文字列から正規表現を生成する方法にありますが、その部分についてはサードパーティのツールに頼ることができるようです。本質的に、あなたがしているのは正規表現コンパイラへの文字列を作成することです。したがって、これを最初から実装する必要がある場合、1つのアプローチは文字列をトークン化し、抽象構文ツリーを構築することです。次に、ASTノードにアクセスして最適化を実行し(たとえば、正規表現* / +演算子で置き換えることができる重複する連続ノードを探す)、最後のアクセスで正規表現を生成します。

より高いレベルでは、正規表現が本当に問題の正解であるかどうかを検討することをお勧めします。いくつかの例を挙げてGoogleでリンクを検索したい場合は、おそらくDOMをトラバースして親を探し、リンクであるすべての子を取得できます。

于 2012-06-26T21:51:47.907 に答える