2017-04-27 62 views
1

我正在使用Python 3.6處理HTML塊,我遇到的問題是下面的循環代碼正在工作,但atag.xpath查詢是搜索整個HTML源代碼並返回data-size的所有四個標記值。Python:Xpath在For循環中爲每個DIV獲取值

我想要做的是,當PAGE_RAW針對for循環處理,對於含有類item一個DIV的每個實例,它會找到一類的padding孩子DIV並拉出data-size屬性,而不是在HTML源代碼中找到的所有標籤。

HTML

<div class="item"> 
    <div class="padding" data-size="12"></div> 
</div> 
<div class="item"> 
    <div class="padding" data-size="13"></div> 
</div> 
<div class="item"> 
    <div class="padding" data-size="14"></div> 
</div> 
<div class="item"> 
    <div class="padding" data-size="15"></div> 
</div> 

代碼

import lxml.html as LH 
... 

PAGE_RAW = driver.page_source 
PAGE_RAW = LH.fromstring(PAGE_RAW) 

for atag in PAGE_RAW.xpath("//div[contains(@class, 'item')]"): 
    data = atag.xpath("//div[contains(@class, 'padding')]/@data-size") 

回答

2

你面對這裏的問題是,在你的第二個XPath的//告訴它來搜索任何地方在文檔(當前節點是否是特定的div並不重要,它始終從開始搜索)。

若要查找當前節點下的任何節點,請用.//替換//.表示搜索以當前節點開始,而不是根開始)。

import lxml.html as LH 
... 

PAGE_RAW = driver.page_source 
PAGE_RAW = LH.fromstring(PAGE_RAW) 

for atag in PAGE_RAW.xpath("//div[contains(@class, 'item')]"): 
    data = atag.xpath(".//div[contains(@class, 'padding')]/@data-size") 
+0

'.//'和'。/'有什麼區別或者有什麼區別? – llanato

+0

雖然'.//'會匹配任何後代(或自己),'。/'只會匹配兒童。 – araraonline

+0

查看第二個答案,這很好解釋:http://stackoverflow.com/questions/35606708/what-is-the-difference-between-and-in-xpath – araraonline