PythonでHTMLを解析する方法:セレクターとバリデーションチェック

PythonでHTMLを解析する方法

Scrapeless Web Unlockerは、独自の解析とバリデーションを行うPythonプログラムのために、取得されたまたはレンダリングされた公開ページのHTMLを提供できます。

TL;DR

  • HTML解析は取得後に始まります。 木を構築する前に、レスポンスが意図したページであることを確認する。
  • Pythonは組み込みおよびサードパーティのパーサーを提供します。 不正なマークアップは異なる木を生成する可能性があるため、意図的に1つを選択します。
  • レコード内のセレクターの範囲。 隣接する項目を混ぜないように、同じカードまたは行から関連フィールドを抽出します。
  • 解析はページのJavaScriptを実行できません。 ターゲットがブラウザの実行後にのみ表示される場合は、取得パスを変更します。

PythonでHTMLを解析するには、マークアップを取得し、ドキュメントツリーを構築し、関連する要素を選択し、見つけた値を正規化します。パーサーは1つのステージに過ぎません。取得したページがログインプロンプトまたはJavaScriptシェルである場合、完璧なセレクターコードでも間違った結果を生み出します。必要なフィールドと、返されたドキュメントが意図されたものであることを示すページマーカーを正確にメモしてください。

このワークフローは、HTMLがローカルに保存されたファイル、許可されたHTTPリクエスト、またはレンダリングサービスから来る場合でも適用されます。BeautifulSoupはナビゲーションとCSS選択のための便利なライブラリであり、Pythonの標準html.parserは低レベルのイベントコールバックを暴露します。選択は抽出タスクに従うべきです。いくつかの安定したタグを持つ小さなページは、ネスティングされたカードとオプションの値を含む不正なマークアップとは異なります。

解析前に正しいHTMLを取得する

HTTPクライアントは初期レスポンスをダウンロードしますが、ページスクリプトを自動的に実行しません。レスポンスボディの最終URL、ステータス、メディアタイプ、および期待されるマーカーを確認してください。ページは200とtext/htmlを返すことができますが、データセットではなく通知を含んでいる場合があります。開発中に、小さな代表的なレスポンスを保存し、資格情報を削除して、セレクターの変更が以前の結果を生み出した正確なバイトに対してテストできるようにします。

その HTTPセマンティクス標準 は、ステータスと表現のメタデータが本体のアプリケーション意味とは別である理由を説明しています。解析のためには、取得の成功を必要だが不十分なものとして扱うことを意味します。レスポンスが圧縮またはエンコードされている場合は、宣言されたメタデータに従って成熟したHTTPライブラリにデコードさせてください。すべてのレガシーページに対してUTF-8を手動で仮定することを避けてください。

生のレスポンスにレコードが存在しないが、ブラウザでページがロードされた後に表示される場合、許可された構造化レスポンスのためにネットワークパネルを調査します。ブラウザの実行が本当に必要な場合、文書化されたレンダリングパスを使用します。 Web Unlocker JS Render。実行後にHTMLを返すことができ、その後Pythonパーサーはその返された表現で作業を行います。レンダリングはマークアップの出所を変えますが、BeautifulSoupがそれをどのように解釈するかは変えません。

明示的なバックエンドでパースツリーを構築する

BeautifulSoupは、Pythonの組み込みhtml.parserなどのマークアップと名前付きパーサーバックエンドを受け入れます。その 公式ドキュメント は、タグ、テキスト、および属性のツリーを検索する方法を説明しています。環境依存のデフォルトを許可するのではなく、コード内でパーサーを固定します。異なるバックエンドは不正なHTMLを異なって修正でき、親子関係を変更し、したがってセレクターの結果を変更します。

小さな自己完結型入力について、h2タイトルを持ち、hrefを持つアンカーと価格を保持するspanを含む記事要素を想像してください。そのマークアップからスープを構築し、最初に記事を選択し、その後それに含まれる各フィールドを読み取ります。この範囲は重要です:ページ上のすべてのh2とすべての価格spanを個別に選択すると、1つの記事に価格がない場合に不一致のリストが生成される可能性があります。レコード指向のパーサーは各記事を抽出の単位として扱います。

Pythonの html.parserモジュール は、タグとデータが読み取られるときにコールバックを必要とする場合のもう1つのオプションです。それはBeautifulSoupと同じ便利なCSS選択およびツリーナビゲーションインターフェースを提供しません。普遍的に正しいからではなく、狭いストリーミングスタイルのタスクに選んでください。代表的な不正型および適正型ページに対して選択したパーサーをテストします。

安定した構造を使用してフィールドを選択する

CSSセレクターは、意味的要素、安定した属性、または短い親子関係をターゲットにできます。ページが意味のあるIDを公開している場合は、article[data-id]のようなセレクターを使用し、その後各記事内のタイトルとリンクを選択します。視覚的レイアウトに関連付けられた生成されたクラス名の長いチェーンは避けてください。それらのクラスはデータフィールドが概念的に同じであっても、再設計中に変更される可能性があります。

BeautifulSoupのselectメソッドはCSSセレクター構文を受け入れ、findおよびfind_allは属性テストやカスタム述語が必要な場合に便利です。セレクターはレコード契約を表現する必要があり、今日正しいカウントを返す偶然だけであってはいけません。代表的なページで選択された要素のテキストと属性を確認してください。欠落しているフィールドが正当な場合、後続のフィールドを間違ったレコードに移動するのではなく、明示的にnullまたは空のオプションの値として表現します。

選択後に抽出された値を正規化します。表示テキストのレイアウト空白を圧縮し、精度が重要な場合は元の生の値を保持し、最終レスポンスURLに対して相対href値を解決します。未観察のリダイレクト後にリクエストされたURLをベースとして使用しないでください。ページが複数の通貨で価格を示している場合、すべての非数字文字を削除して意味を失うのではなく、通貨を数値の隣に保持します。

レコードをバリデートし、セレクターだけではなく

1つのノードを返すセレクタは、そのノードが期待されるレコードであることを証明するものではありません。ユニークなページマーカー、レコードIDまたはcanonical URL、および必要なフィールドを確認してください。リンクが許可されたホストを指していること、タイトルが空でないことを検証します。フィールドがオプションの場合は、スキーマでその不在を定義します。ノードが10個あるパース結果でも、望ましいアイテムの代わりに重複したカードやナビゲーションティーザーを含む可能性があります。

ページネーションは別の境界を追加します。確認された次のリンクや文書化されたカーソルに従い、正規化されたURLやレコードIDの訪問済みセットを保持し、明確な終了条件で停止します。固定ページ数は上限であり、コレクションが自然に終了した証拠ではありません。受け入れられたレコード、拒否されたレコード、およびセレクタのミスを別々に測定し、レイアウト変更が視覚的にわかるようにし、その後の分析が部分的なバッチを完全と見なすのを防ぎます。

許可された公共HTMLから派生した小さなフィクスチャは、純粋な抽出ロジックをテストするのに役立ちますが、ライブの取得パスがまだそのHTMLを返すことを証明するものではありません。現在のページを取得して同一性を検証する統合チェックを維持してください。関連する BeautifulSoupウェブスクレイピングガイド は正確にこの理由から静的取得と動的レンダリングを分離します。

レンダリングするか、構造化データを使用するかを決定してください。

生のHTMLに既にターゲットフィールドが含まれている場合、ブラウザをレンダリングすると、抽出を改善することなく時間と状態を追加します。必要なフィールドを公開する承認されたJSONエンドポイントをページが取得する場合、そのレスポンスを読むことはDOMから表示テキストを再構築するよりも簡単かもしれません。インタラクションやクライアントコードがターゲット要素を作成する場合、ブラウザやレンダリングサービスが適しています。この決定は、観測されたレスポンスから行い、「現代的なサイト」といったラベルから行わないでください。

その Web Unlocker製品ページ は、JavaScriptレンダリングオプションでの公共コンテンツの取得を説明します。Pythonスクリプトは返されたHTMLをBeautifulSoupに渡すことができますが、解析の前にサービスの応答とページマーカーを確認する必要があります。スクリプトが実行されたからといって、レンダリングされた出力が完全であると仮定しないでください。遅延データやポストインタラクションビューには、別の文書化されたステップが必要になる場合があります。

サイトアクセスルールと運用負荷を尊重してください。収集が許可されているページのみを解析し、要求を制限し、アプリケーションに不要な個人データを保持しないでください。これらの決定は、CSSセレクタ内ではなく、パーサーの周りで行われるべきです。スコープ、目的、または保持が未定義であれば、正しい技術的抽出であっても不適切なデータプラクティスとなる可能性があります。

抽出テストはネットワークテストから独立して行ってください。保存された小さなHTMLサンプルは、セレクタが意図されたタイトルを読み取って欠落したリンクを処理していることを確認できます。別のライブチェックは、現在返されているページがまだ期待されるレコードコンテナを含んでいることを確認できます。これらのテストは異なる質問に答えるため、1つがパスしたからといって他のパスが機能する証拠として報告しないでください。ライブページが変更された場合、その新しいマークアップを保存されたサンプルと比較してアプリケーションのストレージルールを変更する前に確認してください。

結論

PythonでHTMLを解析することは、取得、ツリー構築、スコープ選択、正規化、および検証のシーケンスです。パーサーは間違ったページを修復したり、欠落しているJavaScriptを実行したりできません。最初に正しい表現を持っていることを証明し、その後各セレクタをレコードレベルのチェックに責任を持たせます。

Python HTML抽出フローを構築します。

1つの許可された公共ページを取得し、その同一性を確認し、明示的なセレクタで返されたHTMLを解析します。

今すぐ登録して $5の無料クレジットを受け取ります — クレジットカードは不要です.

$5のクレジットを請求する →

FAQ

BeautifulSoupはウェブページをダウンロードしますか?

いいえ。BeautifulSoupは、別のコンポーネントが提供するマークアップを解析します。HTTPクライアント、ローカルファイル、またはレンダリングサービスが最初にHTMLを提供する必要があります。その表現を確認してからパースツリーを作成してください。

どのパーサーをBeautifulSoupに渡すべきですか?

パーサーを慎重に選び、代表的なマークアップに対してテストしてください。Pythonの組み込みhtml.parserは、別のパーサーパッケージなしで利用可能ですが、代替バックエンドは欠陥のあるHTMLを異なる方法で解釈する可能性があります。バックエンドを固定すると、セレクタの挙動がより再現可能になります。

PythonはブラウザなしでJavaScriptレンダリングされたページを解析できますか?

Pythonは、別のコンポーネントがレンダリングした最終HTMLを解析できますが、単純なHTTPリクエストとHTMLパーサーはブラウザJavaScriptを実行しません。ブラウザレンダリングを使用する前に、ターゲットが初期HTMLまたは許可された構造化レスポンスに存在するかどうかを確認してください。

欠落しているフィールドはどのように処理すべきですか?

どのフィールドが必須でどのフィールドがオプションであるかを定義します。必須の値が欠けているレコードは拒否またはフラグ付けし、オプションの不在を明示的に表現します。独立して選択されたタイトルと価格リストをジッパーすることは避けてください。1つの価格が欠落すると、次のすべてのレコードが不一致になる可能性があります。

公共ページのスクレイピングは常に許可されていますか?

公共の可視性は承認、プライバシー、著作権、またはサイトの条件を決定するものではありません。該当するルールを確認し、プロジェクトが使用許可されたもののみを収集してください。リクエスト量を制限し、記載された目的に必要なデータのみを保持してください。

参照