ページの検索結果から返されたデータをインテリジェントに解析するにはどうすればよいですか?
たとえば、多くの本のプロバイダーのWebサイトの検索結果を解析して、オンラインの本を検索するWebサービスを作成するとします。ページの生のHTMLデータを取得し、データをWebサービスで機能させるためにいくつかの正規表現を実行できましたが、いずれかのWebサイトがページのフォーマットを変更すると、コードが壊れます!
RSSは確かにすばらしいオプションですが、多くのサイトにはXML/JSONベースの検索がありません。
ページ上の情報を自動的に広めるのに役立つキットはありますか?クレイジーなアイデアは、あいまいなAIモジュールに検索結果ページのパターンを認識させ、それに応じて結果を解析することです...
私は最近、これのいくつかを行いました、そしてここに私の経験があります。
3つの基本的なアプローチがあります。
オプション2で webハーベスト をいじってみましたが、構文がおかしな感じがします。 XMLといくつかの疑似Javaスクリプト言語の組み合わせ。 Javaが好きで、XMLスタイルのデータ抽出(XPath、XQuery)が好きなら、それがチケットになるかもしれません。
編集:正規表現を使用する場合は、遅延数量詞とキャプチャグループを含むライブラリを使用してください。 PHPの古い正規表現ライブラリにはこれらがなく、HTMLの開始/終了タグ間でデータを一致させるために不可欠です。
解析するfixed HTML構造がないと、データを検索するための正規表現を維持するのが嫌になります。ツリーを構築する適切なパーサーを使用してHTMLを解析する方が幸運かもしれません。次に、より保守しやすい要素を選択します。
明らかに、最良の方法は、解析および検証できる固定マークアップ付きのエンジンからのXML出力です。生成されたツリーを「暗闇で」調査するHTML解析ライブラリは、正規表現よりも保守が簡単だと思います。
このように、<a href="blah" class="cache_link">...
が<a href="blah" class="cache_result">...
に変わったかどうかを確認する必要があります。
結論として、特定の要素を正規表現でgrepするのは厳しいでしょう。より良いアプローチは、ページのモデルのようなDOMを構築し、タグ内の文字データへの「アンカー」を探すことです。
またはメールを送信 XML APIのケースを記載したサイトに...雇われるかもしれません!
あなたはあなたが使用している言語を言っていません。 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"
使用しているテクノロジースタックについては言及していません。 HTMLを解析している場合は、解析ライブラリを使用します。
あなたが言っていることを正確に実行するウェブサービスもあります-商用で無料です。彼らはサイトをこすり取り、ウェブサービスインターフェースを提供します。
また、スクリーンスクレイピングを提供する一般的なWebサービスはYahoo Pipesです。 その前のスタックオーバーフローの質問
それは絶対確実ではありませんが、 Beautiful Soup などのパーサーを確認することをお勧めします。レイアウトが変更されても魔法のように同じ情報を見つけることはできませんが、複雑な正規表現を記述するよりもはるかに簡単です。これはpythonモジュールです。
HTML操作ライブラリの使用を検討しましたか? Rubyには、かなりいいものがあります。例 hpricot
適切なライブラリを使用すると、CSSセレクターまたはxpathを使用して、ページの必要な部分を指定できます。これらは、正規表現を使用するよりもかなり強力です。
Hpricot wikiの例:
doc = Hpricot(open("qwantz.html"))
(doc/'div img[@src^="http://www.qwantz.com/comics/"]')
#=> Elements[...]
.NETやPythonなどで同様のことを行うライブラリを見つけることができると思います。
残念ながら、あなたがウェブサイトからHTMLを解析しようと試みたように、「スクレイピング」が最も一般的なソリューションです。ページの構造的な変更を検出して、修正するように警告のフラグを立てることができます。そのため、最後に変更を加えても、データが失われることはありません。セマンティックWebが現実になるまでは、それが大規模なデータセットを保証する唯一の方法です。
または、APIによって提供される小さなデータセットを使用することもできます。 YahooはAPI(YDNを参照)を介して検索可能なデータを提供するために一生懸命取り組んでいます。AmazonAPIはたくさんの本のデータなどを開くと思います.
少しお役に立てば幸いです。
編集:そしてPHPを使用している場合、私はSimpleHTMLDOMをお勧めします
画面のスクレイピングと希望する言語をグーグルで試します。私はpythonのいくつかのオプションを知っています、あなたの好みの言語に相当するものを見つけるかもしれません:
スクレイピングするWebサイトによっては、上記の方法を1つ以上使用する必要がある場合があります。
他の人が言ったように、DOM表現を構築するHTMLパーサーを使用して、XPath/XQueryでそれを照会できます。私はここで非常に興味深い記事を見つけました:Java理論と実践:XQueryによる画面スクレイピング- http://www.ibm.com/developerworks/xml/library/j- jtp03225.html
Tag Soup のようなものを使用できる場合、それが出発点になります。次に、ページをXML APIのように扱うことができます。
JavaとC++実装があり、うまくいくかもしれません!
http://www.parselets.com のパセリはかなり滑らかに見えます。
JSONを使用して「parslets」を定義し、ページ上で何を探すかを定義し、そのデータを解析します。