我正在使用XPath
和Scrapy
從電影網站BoxOfficeMojo.com上刪除數據。XPath:選擇某些子節點
作爲一個普遍的問題:我想知道如何選擇一個Xpath
字符串中的一個父節點的某些子節點。
根據我從中抓取數據的電影網頁,有時我需要的數據位於不同的子節點,比如是否存在鏈接。我將會瀏覽大約14000部電影,所以這個過程需要自動化。以this爲例。我需要演員,導演和製片人。
這是Xpath
導演:注:這%s對應於該信息被發現一個確定的索引 - 在動作傑克遜示例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()
獲取所有最重要的演員s(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()
這是覆蓋了事實的企圖:第一個演員可能沒有與他有關的鏈接/她和隨後的演員一樣,第一演員可能與他/她有聯繫,但其他人可能不會。
我很欣賞閱讀本文的時間和任何幫助我找到/解決此問題的嘗試!請讓我知道是否需要更多信息。
哇!非常感謝您花時間回覆!我很好奇,爲了看看會發生什麼,如果這些方法將消除從其他'[@ class =「mp_box_content」]獲取信息的問題,我會很快實現這些事情,因爲這是主要問題之一? – DMML
您將只獲得「The Players」表格內容,而不是其他的[@ class =「mp_box_content」]'divs。我用'.text'而不是'.tail'修復了'br2nl',否則一些行被覆蓋。我還介紹了一個編譯XPath表達式,以便您可以將'category'參數作爲XPath變量傳遞,它表示您想要的行的第一個單元格文本 –