3

私は、プログラムでアドレスを取得するためにクロールしている米国議会の各メンバーのWebサイトのリストを持っています。多くのサイトは基礎となるマークアップが異なりますが、何百ものサイトが私が書いたスクリプトに対して期待される結果を提供していないことがわかり始めるまで、これは最初は問題ではありませんでした。

考えられる原因を評価するためにもう少し時間をかけた後strip_tags()、結果を呼び出すfile_get_contents()と、ページのソースのほとんどが何度も消去されていることがわかりました。これは、HTMLを削除するだけでなく、私がスクレイプしたかった非HTMLを削除することでもありました。

そこで、へstrip_tags()の呼び出しを削除し、英数字以外のすべての文字を削除する呼び出しに置き換えて、プロセスをもう一度実行しました。それは他の結果をもたらしましたが、それでも多くを欠いていました。今回は、正規表現が目的のパターンと一致していなかったためです。返されたコードを確認したところ、HTML属性の残りがテキスト全体に散在していて、パターンが壊れていることに気付きました。

これを回避する方法はありますか?不正な形式のHTMLの結果ですか?私はそれについて何かすることができますか?

4

2 に答える 2

5

PHPマニュアルには、次のような警告があります。

strip_tags()は実際にはHTMLを検証しないため、タグの一部または破損により、予想よりも多くのテキスト/データが削除される可能性があります。

あなたは多くの異なるサイトをスクレイピングしていて、それらのHTMLの有効性を説明できないので、これは常に問題になります。残念ながら、正規表現は単にドキュメントパーサーとして切り取られていないため、正規表現はそれを実行しません。

PHP Simple HTML DOM Parserのようなもの、または組み込みのDOMDocument-> loadHTML()メソッドを使用します。

スクレイプしたい各ページと、そのページの構造のどこに情報が見つかったかを記録した小さなデータベースを保持できます。スクレイプするたびに、構造が変更されたかどうかをすばやく確認できます。変更された場合は、データベースをDOMパーサーの新しいパスの場所で更新し、次のスクレイプで取得できます。

于 2009-12-29T01:21:06.060 に答える
0

不正な html が原因である可能性が非常に高いです。DOMDocument::loadhtmlfile()
を介してページを読み込もうとすることができます。エラーを「修正」できますように。libxml_use_internal_errors()も 参照してください。問題を特定して処理するのに役立つ場合があります。

于 2009-12-29T01:21:28.290 に答える