私が探しているもののHTMLを解析するよりも、ウェブページから情報を抽出するより良い方法があるかどうかを知りたいと思います。つまり、「imdb.com」からムービーの評価を抽出するウェブデルファイから情報を抽出する最良の方法
現在、IndyHttpコンポーネントを使用してページを取得していますが、strUtilsを使用してテキストを解析していますが、コンテンツは限られています。
私が探しているもののHTMLを解析するよりも、ウェブページから情報を抽出するより良い方法があるかどうかを知りたいと思います。つまり、「imdb.com」からムービーの評価を抽出するウェブデルファイから情報を抽出する最良の方法
現在、IndyHttpコンポーネントを使用してページを取得していますが、strUtilsを使用してテキストを解析していますが、コンテンツは限られています。
良いウェブサイトを扱う際には、わかりやすい単純な正規表現が非常に直感的で簡単なものであり、IMDBは良いウェブサイトです。
たとえば、IMDBのムービーHTMLページのムービーの評価は<DIV>
で、class="star-box-giga-star"
です。それは正規表現を使って非常に簡単に抽出できます。それはきれいではありませんが、それは仕事をしていません
star-box-giga-star[^>]*>([^<]*)<
:次の正規表現は、キャプチャグループ1に、生のHTMLから映画の評価を抽出します。正規表現は "星型ボックス - ギガスター"クラスIDを探し、次にDIV
を終了する>
を探し、次にすべてを次のようにキャプチャします。<
このような新しい正規表現を作成するには、要素を検査できるWebブラウザ(CromeやOperaなど)を使用する必要があります。 Chromeを使用すると、Webページを見て、キャプチャしたい要素を右クリックしてInspect element
を実行し、次に良い正規表現を作成するために使用できる簡単に識別可能な要素を調べることができます。この場合、"star-box-giga-star"
クラスは明らかに容易に識別できます。良いウェブサイトはCSSとCSSを使用しているため、要素を正しくスタイルできるようにするには、ID
やclass
が必要です。
これはdelphiで動作しますか? – Gab
しかし、それはPHPから知られているSimpleXMLではありません。ここをクリックしてください:http://blog.spreendigital.de/2011/11/10/verysimplexml-a-lightweight-delphi-xml-reader-and-writer/ – gorootde
私はまたSimpleXMLを宣伝します:SimpleXMLは非常に限られていますが、いくつかはとても便利です場合。 OPは解析に代わるものを求めていますが、答えは貴重です。それを使用してサンプルコードを提供する場合、私はそれをupvoteします。ありがとうございました。 – menjaraz
処理RSSフィードはより快適です。投稿の時のよう
、唯一RSSは、サイト上で利用できるフィードのとおりです。この日
に死亡しましたhelp deskに連絡して新しい電話番号を追加するよう電話することができます。 RSSフィードの処理に
資源:ここSO上
HTMLを有効なXMLに変換し、XMLパーサーを使用してください(多分XPATHを使用するか、独自のコードを開発しています)。
すべての回答はあなたの一般的な質問をカバーしています。私は通常、コスミンの詳細な戦略に似ています。私は、Web抽出の必要性の大部分にwininetとregexを使用しています。
しかし、imdbの資格を抽出する際に、特定のサブクエリで私の2セントを追加してみましょう。 IMDBAPI.COMは、jsonコードを返すクエリインターフェイスを提供しています。これは、このタイプの検索には非常に便利です。
だから、IMDBの評価を取得するための非常にシンプルなコマンドラインプログラムは、ウェブサイトをスクレイピングするとき
program imdbrating;
{$apptype console}
uses htmlutils;
function ExtractJsonParm(parm:string;h:string):string;
var r:integer;
begin
r:=pos('"'+Parm+'":',h);
if r<>0 then
result:=copy(h,r+length(Parm)+4,pos(',',copy(h,r+length(Parm)+4,length(h)))-2)
else
result:='N/A';
end;
var h:string;
begin
h:=HttpGet('http://www.imdbapi.com/?t=' + UrlEncode(ParamStr(1)));
writeln(ExtractJsonParm('Rating',h));
end.
"スクリーンスクレイピング"よりもはるかに壊れにくい答えです。 –
、あなたが情報の可用性に依存することはできません...でしょう。 IMDBはあなたのスクレイピングを検出してブロックしようとするかもしれませんし、フォーマットを頻繁に変更してより難しくするかもしれません。
したがって、サポートされているAPIまたはRSSフィードを使用するか、少なくともウェブサイトの許可を得てデータを集約し、条件を遵守するようにしてください。ほとんどの場合、この種のアクセスには料金を支払う必要があります。許可なくウェブサイトをスクラップすると、いくつかの法的正面(サービス拒否および知的財産)の責任が生じる可能性があります。ここで
はIMDBのstatementです:
あなたが当社のウェブサイト上でのデータマイニング、ロボット、スクリーンスクレイピング、または類似 オンラインデータ収集・抽出ツールを使用することはできません。
あなたの質問にお答えするには、より良い方法はウェブサイトが提供する方法を使用することです。非商用利用の場合は、termsを守る場合はdownload the IMDB database directlyとし、サイトを削る代わりにそこからデータを使用してください。データベースを頻繁に更新するだけで、サイトを削るよりも優れたソリューションです。あなたはそれの周りに独自のWeb APIをラップすることさえできます。定格はスタンドアロンのテーブルとして利用できます。
+1は、画面の擦り傷の危険性を指摘するためのものです。 Downvoteは不当です、btw。 IMOでは、このような議論の側面は、第三者データの重要な使用に不可欠です。 –
Webページは有効なXHTMLドキュメントではなく、JavascriptでDOMを変更できるため、TWebBrowserやChromium Embeddedなどの埋め込みWebブラウザからDOMを探索する必要があります。 –
DOMとTWebBrowserに依存することは、遅くてエラーを起こしやすいため、最後の手段である必要があります。スクラップされるデータがJavaScriptから来た場合、JavaScriptから直接データをスクラップすることができます。何らかの形のAjaxで満たされている場合、Ajax URLを直接作成して取得できます。ブラウザが何であれ、手動でエミュレートすることができます。 –