34

ページの検索結果から返されたデータをインテリジェントに解析するにはどうすればよいでしょうか?

たとえば、多くの書籍提供者の Web サイトの検索結果を解析して、オンラインの書籍を検索する Web サービスを作成したいとします。ページの生の HTML データを取得し、Web サービスでデータを機能させるためにいくつかの正規表現を実行できますが、Web サイトのいずれかがページの書式設定を変更すると、コードが壊れてしまいます!

RSS は実に素晴らしいオプションですが、多くのサイトには XML/JSON ベースの検索機能がありません。

ページ上の情報を自動的に広めるのに役立つキットはありますか? クレイジーなアイデアは、ファジー AI モジュールに検索結果ページのパターンを認識させ、それに応じて結果を解析させることです...

4

11 に答える 11

24

私は最近これをいくつか行いました。ここに私の経験があります。

3 つの基本的なアプローチがあります。

  1. 正規表現。
    • 大まかに構造化された情報と変化するフォーマットで最も柔軟で使いやすい。
    • 構造/タグ分析を行うのは難しくなりますが、テキスト マッチングを行うのは簡単になります。
    • データ形式の組み込み検証。
    • ドキュメントの抽出/変換に使用するパターンごとに正規表現を作成する必要があるため、他のものよりも維持するのが難しい
    • 通常、2 および 3 よりも低速です。
    • 同様の形式のアイテムのリストに適しています
    • 優れた正規表現開発/テスト ツールといくつかのサンプル ページが役立ちます。ここで RegexBuddy について良いことを言いたいと思います。彼らのデモを試してみてください。
    • 私はこれで最も成功しました。この柔軟性により、厄介で野蛮な野生の HTML コードを扱うことができます。
  2. HTML を XHTML に変換し、XML 抽出ツールを使用します。 HTML をクリーンアップし、正当な XHTML に変換し、XPath/XQuery/X-whatever を使用して XML データとして照会します。
    • ツール: TagSoup、HTMLTidy など
    • HTML から XHML への変換の品質は非常に重要であり、非常に変化しやすいものです。
    • 必要なデータが HTML レイアウトとタグによって構造化されている場合の最適なソリューション (HTML テーブル、リスト、DIV/SPAN グループなどのデータ)
    • リンク構造、ネストされたテーブル、画像、リストなどの取得に最適
    • オプション 1 よりも高速ですが、オプション 3 よりも遅くなります。
    • コンテンツのフォーマットが変更/可変である場合はうまく機能しますが、ドキュメントの構造/レイアウトはそうではありません。
    • データが HTML タグによって構造化されていない場合、問題が発生します。
    • オプション 1 で使用できます。
  3. パーサー ジェネレーター (ANTLR など) -- ページを解析および分析するための文法を作成します。
    • 私の(乱雑な)ページには適していなかったため、これは試していません
    • HTML 構造が高度に構造化され、非常に一定で規則的で、変更されない場合に最適です。
    • ドキュメントに記述しやすいパターンがあるが、HTML タグを含まず、再帰または複雑な動作を伴う場合は、これを使用します。
    • XHTML 入力を必要としない
    • 一般的に最速のスループット
    • 学習曲線は大きいが、保守は容易

オプション 2 のWeb ハーベストをいじってみましたが、その構文はちょっと変だと思います。XML といくつかの疑似 Java スクリプト言語の混合。Java が好きで、XML スタイルのデータ抽出 (XPath、XQuery) が好きなら、それはあなたのためのチケットかもしれません。


編集: 正規表現を使用する場合は、遅延量指定子とキャプチャ グループを含むライブラリを必ず使用してください。PHP の古い正規表現ライブラリにはこれらがなく、HTML の開始タグと終了タグの間でデータを照合するために不可欠です。

于 2009-08-03T17:39:52.857 に答える
3

解析する固定の HTML 構造がなければ、データを検索するための正規表現を維持することはできません。ツリーを構築する適切なパーサーを使用して HTML を解析できれば、もっとうまくいくかもしれません。次に、より保守しやすい要素を選択します。

明らかに最良の方法は、解析および検証できる固定マークアップを含むエンジンからの XML 出力です。生成されたツリーを「暗闇の中で」調査する HTML 解析ライブラリは、正規表現よりも保守が簡単になると思います。

このように、あなたはただ何に<a href="blah" class="cache_link">...変わる<a href="blah" class="cache_result">...かをチェックする必要があります。

要するに、特定の要素を正規表現でgrepするのは厳しいでしょう。より良いアプローチは、ページの DOM のようなモデルを構築し、タグ内の文字データへの「アンカー」を探すことです。

または、XML API のケースを記載したメールをサイトに送信してください。採用されるかもしれません!

于 2009-08-03T17:10:05.880 に答える
3

使用している言語は言いません。Java ランドでは、TagSoupと XPath を使用して、苦痛を最小限に抑えることができます。このブログの例があります(もちろん、必要に応じて XPath はさらに複雑になる可能性があります)。

URL url = new URL("http://example.com");
SAXBuilder builder = new SAXBuilder("org.ccil.cowan.tagsoup.Parser"); // build a JDOM tree from a SAX stream provided by tagsoup
Document doc = builder.build(url);
JDOMXPath titlePath = new JDOMXPath("/h:html/h:head/h:title");
titlePath.addNamespace("h","http://www.w3.org/1999/xhtml");
String title = ((Element)titlePath.selectSingleNode(doc)).getText();
System.out.println("Title is "+title);

XPath 式を外部化することをお勧めします。これにより、サイトが変更された場合にある程度の保護が得られます。

これは、このサイトのスクリーンスクレイピングに絶対に使用していない XPath の例です。まさか、私ではありません:

"//h:div[contains(@class,'question-summary')]/h:div[@class='summary']//h:h3"
于 2009-08-03T17:14:13.267 に答える
2

使用しているテクノロジースタックについて言及していません。HTML を解析している場合は、解析ライブラリを使用します。

あなたが言っていることを正確に実行するWebサービスもあります-商用および無料. サイトをスクレイピングし、Web サービス インターフェイスを提供します。

また、スクリーン スクレイピングを提供する一般的な Web サービスは Yahoo Pipes です。それに関する以前のstackoverflowの質問

于 2009-08-03T17:14:43.640 に答える
2

絶対確実というわけではありませんが、 Beautiful Soupなどのパーサーを参照することをお勧めします。レイアウトが変更されても魔法のように同じ情報を見つけることはできませんが、複雑な正規表現を記述するよりもはるかに簡単です。これは python モジュールであることに注意してください。

于 2009-08-03T17:15:42.673 に答える
1

スクリーン スクレイピング + 好みの言語をグーグルで検索してみてください。Python のいくつかのオプションを知っています。お好みの言語に相当するものを見つけることができます。

  • 美しいスープ
  • mechanize: perl WWW:Mechanize に似ています。Web ページと相互作用するオブジェクトのようなブラウザを提供します
  • lxml: libwww への python バインディング
  • スクレイプマーク: テンプレートを使用してページの一部をスクレイピングします
  • pyquery: xml/xhtml ドキュメントで jQuery クエリを作成できます
  • Scrapy: Web ページをクロールおよび解析するスパイダーを作成するための高レベルのスクレイピングおよび Web クロール フレームワーク

スクレイピングする Web サイトによっては、上記のアプローチの 1 つまたは複数を使用する必要がある場合があります。

于 2009-08-03T18:12:33.557 に答える
1

HTML操作ライブラリの使用を検討しましたか? Ruby にはかなり優れたものがあります。例: hpricot

優れたライブラリを使用すると、CSS セレクターまたは xpath を使用して、必要なページの部分を指定できます。これらは、正規表現を使用するよりもはるかに堅牢です。

hpricot wiki の例:

 doc = Hpricot(open("qwantz.html"))
 (doc/'div img[@src^="http://www.qwantz.com/comics/"]')
   #=> Elements[...]

.NET や Python などで同様のことを行うライブラリを見つけることができると確信しています。

于 2009-08-03T17:12:51.647 に答える
1

残念ながら、「スクレイピング」が最も一般的な解決策です.Web サイトから HTML を解析しようとしていると言ったように。ページの構造上の変更を検出し、修正するよう警告を発することができます。これにより、最後に変更が加えられてもデータが失われることはありません。セマンティック Web が現実のものとなるまでは、それが大規模なデータセットを保証する唯一の方法です。

または、API によって提供される小さなデータセットに固執することもできます。Yahoo は API を通じて検索可能なデータを提供するために懸命に取り組んでいます (YDN を参照)。

少しでもお役に立てば幸いです!

編集: PHP を使用している場合は、SimpleHTMLDOM をお勧めします

于 2009-08-03T17:14:32.020 に答える
0

他の人が言っているように、DOM表現を構築するHTMLパーサーを使用して、XPath/XQueryでクエリを実行できます。ここで非常に興味深い記事を見つけました:Javaの理論と実践:XQueryを使用した画面スクレイピング-http: //www.ibm.com/developerworks/xml/library/j-jtp03225.html

于 2010-10-21T11:05:33.390 に答える
0

Tag Soupのようなものを使用できる場合は、それが出発点になります。次に、そのページを XML API のように扱うことができます。

Java と C++ の実装があり、動作する可能性があります。

于 2009-08-03T17:14:31.520 に答える
0

http://www.parselets.comのParsleyはかなり洗練されています。

JSON を使用して「パースレット」を定義し、ページ上で何を探すかを定義すると、そのデータが解析されます。

于 2009-09-23T21:16:16.890 に答える