2016-04-21 25 views
1

我想要獲取使用Scrapy的各種文章的HTML。這些文章還包括我想分開處理的圖像。如何使用XPath從HTML Scrapy中過濾圖像?

如果我有一篇文章,其HTML看起來像這樣:

<div class="article> 
    <p>This is a sentence.</p> 
    <p>This is a sentence.</p> 
    <img src="/path/to/image.jpg"/> 
    <p>This is a sentence.</p> 
    <p>This is a sentence.</p> 
</div> 

我怎樣才能湊只是非圖像HTML,或這樣的:

<div class="article> 
    <p>This is a sentence.</p> 
    <p>This is a sentence.</p> 
    <p>This is a sentence.</p> 
    <p>This is a sentence.</p> 
</div> 

我已經試過目前:

article = response.xpath("//div[@class='article'][not(img)]").extract() 

...但這仍然包括圖像。

回答

1

XPath是用於選擇的,而不是轉化或重排。

您可以選擇沒有img孩子div元素:

//div[@class='article' and not(img)] 

或沒有img後代:

//div[@class='article' and not(.//img)] 

或者,您也可以選擇div元素是內容p

//div[@class='article']/p 

或不是img

//div[@class='article']/*[not(self::img)] 

但你不能選擇請求的HTML,

<div class="article"> 
    <p>This is a sentence.</p> 
    <p>This is a sentence.</p> 
    <p>This is a sentence.</p> 
    <p>This is a sentence.</p> 
</div> 

,因爲這是一個重排,而不是一個選擇,標記的存在的輸入文件內。

+0

明白了 - 這就是爲什麼其他響應('/ div [@ class ='article']/* [not(self :: img)]')返回_nothing_ ......因爲文章I試圖選擇有圖像,那隻會選擇沒有圖像的文章? – YPCrumble

+0

您在評論中提到的XPath會選擇所有文章'div'元素的所有非圖像子元素。如果它沒有選擇任何東西,並且讓你感到意外,我不得不看HTML來說更多。 – kjhughes

0

嘗試以下代碼:

article = response.xpath("//div[@class='article']//*[not(self::img)]").extract()