Python:Xpath在For循环中为每个DIV获取值

时间:2017-04-27 00:19:21

标签: python python-3.x xpath

我使用Python 3.6处理一大块HTML,我遇到的问题是循环下面的代码正在运行,但atag.xpath查询正在搜索整个HTML源代码并返回data-size的所有四个标记值。

我尝试做的是,为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")

1 个答案:

答案 0 :(得分:3)

您在此处遇到的问题是,在您的第二个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")