1

映画の Web サイト BoxOfficeMojo.com からデータを取得するためにXPathwithを使用しています。Scrapy

一般的な質問として: 1 つの親ノードの特定の子ノードをすべて 1 つのXpath文字列で選択する方法を知りたいです。

データをスクレイピングしている映画の Web ページによっては、リンクがあるかどうかなど、必要なデータが異なる子ノードにある場合があります。約 14000 本の映画を処理するので、このプロセスを自動化する必要があります。

これを例として使用します。俳優、監督、プロデューサーが必要です。

これはXpathディレクターへのメッセージです:: %s は、その情報が見つかる決定されたインデックスに対応します - アクション Jackson の例では、とでdirector見つかります。[1]actors[2]

 //div[@class="mp_box_content"]/table/tr[%s]/td[2]/font/text()

ただし、ディレクターのページへのリンクが存在する場合、これは次のようになりますXpath

 //div[@class="mp_box_content"]/table/tr[%s]/td[2]/font/a/text()

<br>アクターは、リストされている後続のアクターに含まれているため、もう少し注意が必要です。これは、 の子/aまたは親の子である可能性があります/font

//div[@class="mp_box_content"]/table/tr[%s]/td[2]/font//a/text()

ほとんどすべてのアクターを取得します ( を除くfont/br)。

さて、ここでの主な問題は、複数あることです。//div[@class="mp_box_content"]私が持っているものはすべて、他のものからいくつかの数字を取得することを除いて機能しmp_box_contentます。また、すべてを取得するために、多数のtry:,except:ステートメントを追加しました (俳優、監督、プロデューサーの両方に関連付けられたリンクがある場合とない場合)。たとえば、Scrapyアクターのコードは次のとおりです。

 actors = hxs.select('//div[@class="mp_box_content"]/table/tr[%s]/td[2]/font//a/text()' % (locActor,)).extract()
 try:
     second = hxs.select('//div[@class="mp_box_content"]/table/tr[%s]/td[2]/font/text()' % (locActor,)).extract()
     for n in second:
         actors.append(n)
 except:
     actors = hxs.select('//div[@class="mp_box_content"]/table/tr[%s]/td[2]/font/text()' % (locActor,)).extract()

これは、最初のアクターには関連付けられたリンクがなく、後続のアクターには関連付けられている可能性がある、最初のアクターには関連付けられたリンクがあっても残りのアクターには関連付けられていないという事実をカバーする試みです。

これを読むのにかかった時間と、この問題を見つけて対処するのを手伝ってくれる試みに感謝します! さらに情報が必要な場合はお知らせください。

4

1 に答える 1