2

こんにちは、私の本のコレクションに関する事実データのデータベースを構築しています。つまり、タイトル、ページ数、幅、長さ、著者、著者の生年月日、出版社名、出版社の住所などです。そのために、ISBN を入力すると、アプリケーションがその情報を Web から取得します。私が自分で定義したいくつかのサイトから、必要なすべての情報が含まれていることがわかっています。現時点では 3 つのサイトであり、おそらく 5 つを超えることはありません。これらの各サイトで、isbn をクエリ パラメーターとして使用して検索ページを CURL し、検索ページに表示されるリンクを抽出します。次に、これらのリンクを CURL し、上記の情報 (出生、タイトル、出版社など) を抽出します。彼ら。したがって、私のスクレイピングの範囲は、3 x (検索ページ + 情報ページ) = 6 HTML ページです。

これらのページはすべて、ばかげた方法で関連情報を提示しています。たとえば、発行者情報には、アドレス、電話番号、電子メール、ウェブサイトが 1 つの HTML タグに含まれており、区切り文字として brs が使用されています。一部のサイト運営者はこれらのフィールドの 1 つを持っていません。そのため、brs の数が常に同じであるとは限りません。これらのサイトの別のサイトでは、ほとんどの情報に lis がありますが、あるフィールドには a、別のフィールドには p、別のフィールドには div があります。等...

正規表現を使用して、次にDOMパーサーを使用して、必要なものを正常に抽出しました。最終的に、情報のフィールドを抽出するためにより多くの操作が必要になるため、DOM パーサーを使用するとコードの可読性が大幅に低下します。例として:

<li>Né le : 23/12/1990 (ANGLETERRE)</li>

男性の著者の誕生日の場合、女性の著者の生年月日も次のように表示されます

<li>Née le : 11/07/1832</li>

DOM パーサーでは、いくつかの重要な情報が ap、div、および a にあるため、lis のリストを取得する必要がありますが、これでは十分ではありません。次に、li ごとに、li に「Né le」または「Née le」が含まれているかどうかを確認する必要があります。これは、ifs または正規表現のいずれかです。括弧で囲まれた出生地があるかどうかを確認し、それを抽出します。少なくともあと 2 回の操作。正規表現を使用すると、1 行のコードで取得できます。

さらに、パーサーはどのように正確に構築されますか? 基礎となるコードは正規表現を実行しますか、それとも何か他のものですか? もしそうなら、高速で汚い正規表現に対して、解析エンジンを使用すると、高いパフォーマンスコストがかかると思いますか?

ここに私の 2 つの質問があります。DOM パーサーはどのように構築されているのでしょうか。そして第二に、6 ~ 10 ページを解析するという非常に限られた範囲で、主に個人的な使用のために、コードの読みやすさ (および最初の質問に応じたパフォーマンス) を求めるべきではありませんか?

よろしく、 セバスチャン

4

1 に答える 1

6

DOMパーサーはどのように構築されていますか?それは基になる正規表現を使用していますか?

これはパーサーであり、通常は正規表現では実装されません。内部的には、一度に HTML の各文字を調べて、ステート マシンを使用して文字の意味と DOM への適合方法を「把握」します (これには、壊れた HTML の修正、閉じる必要のある要素の終了などが含まれます)。 )。

C# (または Java) を読める場合は、HTML Agility Packのソース コード、特にParseメソッドを読むことをお勧めします。これがどのように行われるかを非常に明確に示します。

HTML を正しく解析する方法の明確な情報源は、whatwg HTML 仕様のセクション 12.2にあります (リンクは最初のページのみであることに注意してください。他にもあります)。これは心のフェイント向けではありません;)

主に個人的な使用のために、6〜10ページを解析するという非常に限られた範囲のために、コードの読みやすさ(および最初の質問に応じたパフォーマンス)を求めるべきではありませんか?

よく知られているHTML 形式を解析するための正規表現は問題ありません。多くの異なるソースからの HTML を regex で解析しようとすることに対して、人々は激怒します。これは実際には不可能だからです (HTML は通常の言語ではないため、多くの例外と矛盾が生じることになります)。

これが限定された使用および限定された HTML 形式用である場合は、先に進んで正規表現を使用してください。あなたにとってより読みやすいものは何でもしてください。

于 2012-09-15T17:46:47.053 に答える