如何为没有属性的div中的节点创建XPath

2024-09-30 16:20:17 发布

您现在位置:Python中文网/ 问答频道 /正文

我想通过sibX节点来获取标签。奇怪的是,我可以在sib0下得到标签child0x,但不能得到后续的sib

我试着从sib0执行preceding-sibling::ancestor::,但是XPath总是返回空的。你知道吗

<div class="parent">
    <div> <!-- *** empty div starts here *** -->
        <div class="sib0">
            <label class="child00">child00</label>
            …
            <label class="child0N">child0N</label>
        </div>
        <div class="sib1">
            <label class="child10">child10</label>
            …
            <label class="child1N">child1N</label>
        </div>
        <div class="sib2">
            <label class="child20">child20</label>
            …
            <label class="child2N">child2N</label>
        </div>
    </div> <!-- *** empty div ends *** -->
<div>

Tags: div节点标签labelclassemptychild10sib0
2条回答

看看这是否有帮助:

from lxml import etree

root = etree.fromstring("""<div class="parent">
    <div> 
        <div class="sib0">
            <label class="child00">child00</label>
            <label class="child0N">child0N</label>
        </div>
        <div class="sib1">
            <label class="child10">child10</label>
            <label class="child1">child1N</label>
        </div>
        <div class="sib2">
            <label class="child20">child20</label>
            <label class="child2N">child2N</label>
        </div>
    </div> 
</div>""")

for e in root.xpath('/div[@class="parent"]/div/div'):
    print(e.attrib['class'])
    children = e.getchildren()
    for child in children:
        print(child.text)

它将输出

sib0
child00
child0N
sib1
child10
child1N
sib2
child20
child2N

因此,可以在循环中分别使用每个sib div的标签子级

您可以在XPath中使用contains来访问其类中包含'sib'的所有节点。你知道吗

response.xpath('//*[contains(@class, "sib")]//text()').getall()

您还可以对'child'执行相同的操作:

response.xpath('//*[contains(@class, "child")]/text()').getall()

相关问题 更多 >