Python:Xpath问题为For循环中的每个DIV获取价值

lla*_*ato 2 python xpath python-3.x

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

我想做的是,在PAGE_RAW处理for循环时,对于包含该类的DIV的每个实例,item它将找到具有的类的子DIV padding并提取该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>
Run Code Online (Sandbox Code Playgroud)

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")
Run Code Online (Sandbox Code Playgroud)

ara*_*ine 5

您在这里面临的问题是,在第二个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")
Run Code Online (Sandbox Code Playgroud)