インタビューのクイズの質問に答えていましたが、質問はスクリーンスクレイピングをどのように行うかについてでした. つまり、情報を直接照会するより構造化された方法 (Web サービスなど) がないと仮定して、Web ページからコンテンツを選択することです。
私の解決策は、XQuery式を使用することでした。必要なコンテンツが HTML 階層のかなり深いところにあったため、式はかなり長くなりました。id
属性を持つ要素を見つける前に、かなりの方法で祖先を検索する必要がありました。たとえば、製品ディメンションの Amazon.com ページをスクレイピングすると、次のようになります。
//a[@id="productDetails"]
/following-sibling::table
//h2[contains(child::text(), "Product Details")]
/following-sibling::div
//li
/b[contains(child::text(), "Product Dimensions:")]
/following-sibling::text()
これはかなり厄介な表現ですが、Amazon が Web サービス API を提供するのはそのためです。とにかく、それはほんの一例です。質問は Amazon に関するものではなく、スクリーン スクレイピングに関するものです。
インタビュアーは私の解決策を気に入らなかった. Amazon によるページ デザインの変更により、XQuery 式の書き直しが必要になる可能性があるため、彼はそれが壊れやすいと考えました。適用対象のページ内のどこにも一致しない XQuery 式をデバッグするのは困難です。
私は彼の発言に反対しませんでしたが、彼の解決策が改善だとは思いませんでした. たとえば、Perl を使用すると、次のようになります。
$html =~ m{<li>\s*<b>\s*Product Dimensions:\s*</b>\s*(.*?)</li>}s;
私の反論は、これは Amazon が HTML コードを変更しても影響を受けやすいというものでした。HTML タグを大文字 ( <LI>
) で綴ったり、CSS 属性を追加したり、ラベル「製品の寸法:」を「寸法:」に変更<b>
し<span>
たり、その他のさまざまな種類の変更を行ったりすることができます。私の言いたいことは、彼が私の XQuery ソリューションで指摘した弱点は、正規表現では解決できないということでした。
さらに、正規表現に十分なコンテキストを追加しない限り、正規表現は誤検知を検出する可能性があります。また、コメント、属性文字列、または CDATA セクション内にあるコンテンツと意図せず一致することもあります。
私の質問は、スクリーンスクレイピングを行うためにどのテクノロジーを使用していますか? なぜそのソリューションを選択したのですか?それを使用する説得力のある理由はありますか?それとも他のものを使用しないのですか?上に示したもの以外に 3 番目の選択肢はありますか?
PS: 議論のために、目的のコンテンツを取得するための Web サービス API やその他のより直接的な方法はないと仮定します。