2017-05-19 24 views
0

html-structure的Python的xpath問題

在我想獲得存儲在div元素帶有class =「大12列標籤杆標籤文本」,這是在貓的示例中的數據的結束。

當使用XPath用蟒:

print(tree.xpath('//*[@id="tags-holder"]')) 
print(tree.xpath('//*[@id="tags-holder"]/div[1]')) 
print(tree.xpath('//*[@id="tags-holder"]/div[1]/div[4]')) 

第一個返回預期「主」 div元素,但第二和第三個返回一個空列表。 是否有此行爲的任何特別的原因?

+0

你可以分享你正在試圖scrapy哪個網址? –

+0

https://imagga.com/auto-tagging-demo?url=https://static.pexels.com/photos/104827/cat-pet-animal-domestic-104827.jpeg – Meowcat

+0

檢查我更新的答案。 –

回答

0

我懷疑你的樹是不是在圖片中的一個節目,假設樹是:

import scrapy 
from scrapy.selector import Selector 
from scrapy.http import HtmlResponse 
tree = '<div id="tags-holder">\ 
    <div class="tags-holder1">\ 
     <div class="large-12 columns tag-bar concept"></div>\ 
     <div class="large-12 columns rel-bar">test</div>\ 
     <div class="large-12 columns percentage">100.00%</div>\ 
     <div class="large-12 columns tag-bar tag-text">cat</div>\ 
    </div>\ 
    <div class="tags-holder2">\ 
     <div class="large-12 columns tag-bar concept"></div>\ 
     <div class="large-12 columns rel-bar">test</div>\ 
     <div class="large-12 columns percentage">100.00%</div>\ 
     <div class="large-12 columns tag-bar tag-text">dog</div>\ 
    </div>\ 
    <div class="tags-holder3">\ 
     <div class="large-12 columns tag-bar concept"></div>\ 
     <div class="large-12 columns rel-bar">test</div>\ 
     <div class="large-12 columns percentage">100.00%</div>\ 
     <div class="large-12 columns tag-bar tag-text">elphant</div>\ 
    </div>\ 
</div>' 
print Selector(text=tree).xpath('//*[@id="tags-holder"]') 
print Selector(text=tree).xpath('//*[@id="tags-holder"]/div[1]') 
print Selector(text=tree).xpath('//*[@id="tags-holder"]/div[1]/div[4]/text()').extract() 

輸出將是:

[<Selector xpath='//*[@id="tags-holder"]' data=u'<div id="tags-holder"> <div class="ta'>] 
[<Selector xpath='//*[@id="tags-holder"]/div[1]' data=u'<div class="tags-holder1">  <div c'>] 
[u'cat'] 

你的邏輯是正確的這種情況下,就需要使用text()extract()

更新:

根據您所提供的網址,我發現<div id="tags-holder">是由JavaScript生成的,但Scrapy下載運行您的回調之前整個響應,這意味着的JavaScript生成的內容將不會在響應中。如果您查看源代碼,tags-holder是空的:

<h6 id="concepts">Concepts</h6> 

<div id="tags-holder" class="holder" style="display: block;"> 
</div> 

<div id="tags-holder-extra" class="holder"> 
</div> 

這就是爲什麼你的第一個xpath已經返回,但其他兩個返回空。

,如果你使用的瀏覽器開發者工具(火狐,谷歌Chrome或Safari),在Chrome中,你可以將它打開菜單 - >工具 - >開發工具,然後從這裏可以看到整個負載響應。

我想你最好用seleniumsplash嘗試這種動態網站。