2016-06-24 152 views
5

我遇到了一個有點複雜的XPath問題。考慮的網頁(我使用Imgur和更換一些文字)的一部分,此HTML:XPath選擇圖像鏈接 - 僅當img src的父級href鏈接存在時,否則選擇img src鏈接

<a href="//i.imgur.com/ahreflink.jpg" class="zoom"> 
    <img class="post-image-placeholder" src="//i.imgur.com/imgsrclink.jpg"> 
    </img> 
</a> 

我首先要搜索的文件中,並找到其對應的src ES所有img標籤。接下來,我要檢查img src鏈接是否包含圖像文件擴展名(.jpeg,.jpg,.gif,.png)。如果它不包含圖片擴展名,請不要抓住它。在這種情況下,它有一個圖像擴展名。現在我們要弄清楚我們想要抓取哪個鏈接。由於parent href存在,我們應該抓住相應的鏈接。

所需的結果://i.imgur.com/ahreflink.jpg

但是,現在讓我們假設parent href不存在:

<a name="missing! oh no!"> 
    <img class="post-image-placeholder" src="//i.imgur.com/imgsrclink.jpg"> 
    </img> 
</a> 

所需的結果://i.imgur.com/imgsrclink.jpg

如何去構建這個XPath?如果它有幫助,我也使用Python(Scrapy)和XPath。所以如果問題需要分離出來,Python也可以使用。

+0

你到目前爲止嘗試過什麼嗎? –

+0

我只得到了檢查鏈接圖像擴展的部分,但卻對如何選擇要抓取的鏈接感到困惑。 – dtgee

+0

您是否想完全使用XPath來獲得結果,或者您是否使用了腳本語言,您可以使用某些邏輯來實現? –

回答

4

這是一個XPath表達式很簡單的事:

//a[not(@href)]/img/@src | //a[img]/@href 
+0

哇,我從來沒有想過優先img src(與不),因爲從邏輯上講,我們首先優先href。看起來像一個有前途的解決方案,但我必須先測試它。 – dtgee

+0

@dtgee沒有優先級,只有過濾器。 – o11c

4

您不必在單個XPath表達式中執行此操作。這裏是一個Scrapy具體實施省略,圖像擴展檢查(通過評論來看,你已經想通了這一點):

images = response.xpath("//a/img") 
for image in images: 
    a_link = image.xpath("../@href").extract_first() 
    image_link = image.xpath("@src").extract_first() 

    print(a_link or image_link) 
+0

啊,謝謝。我想我陷入了一種恍惚狀態,因爲我不得不使用XPath來選擇一切。我會從這個錯誤中學習! – dtgee

+0

@dtgee你可能*做*想在xpath中完成它,以保持C而不是Python的繁重工作。 – o11c

+0

是。使用Python使得代碼更具可讀性,但我想使用XPath並添加一些註釋可以達到同樣的目的。 – dtgee