2017-04-27 13 views
1

Python 3.6を使用してHTMLの塊を処理していますが、ループの下のコードが機能していますが、atag.xpathクエリが問題ですHTMLソース全体を検索し、data-sizeの4つのタグ値をすべて返します。Python:Xpath Forループ内の各DIVの値を取得する問題

は私がやろうとしていることであるPAGE_RAWforループ用に処理されたときに、それはpaddingのクラスと子のDIVを見つけ、data-sizeを引き出しますitemのクラスを含むDIVのすべてのインスタンスのためにHTMLソースでの検索の場合、その1つのタグの属性であり、すべてのタグではありません。

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

あなたがここに直面している問題は、2番目のxpathで、//どこでも内を検索するように指示されていることですドキュメント(現在のノードが特定のdivであれば、それは常にstartから検索します)。

現在のノードの下にあるノードを見つけるには、//.//に置き換えます(.は、ルートではなく現在のノードから検索が始まることを示します)。

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

ここで2番目の答えを確認してください。よく説明されています:http://stackoverflow.com/questions/35606708/what-is-the-difference-between-and-in-xpath – araraonline

関連する問題