繁体   English   中英

使用xpath的lxml.html获取子元素(Python)

[英]get sub elements with xpath of lxml.html (Python)

我正在尝试使用lxml.html获取子元素,代码如下。

import lxml.html as LH

html = """
<ul class="news-list2">
            <li>
            <div class="txt-box">
            <p class="info">Number:<label>cewoilgas</label></p>
            </div>
            </li>

            <li>
            <div class="txt-box">
            <p class="info">Number:<label>NHYQZX</label>
            </p>
            </div>
            </li>

        <li>
            <div class="txt-box">
            <p class="info">Number:<label>energyinfo</label>
            </p>
            </div>
            </li>

        <li>
            <div class="txt-box">
            <p class="info">Number:<label>calgary_information</label>
            </p>
            </div>
            </li>

        <li>
            <div class="txt-box">
            <p class="info">Number:<label>oilgas_pro</label>
            </p>
            </div>
            </li>

</ul>
"""

要获取li中的sub元素:

htm = LH.fromstring(html)
for li in htm.xpath("//ul/li"):
    print li.xpath("//p/label/text()")

好奇为什么结果是

['cewoilgas', 'NHYQZX', 'energyinfo', 'calgary_information', 'oilgas_pro']
['cewoilgas', 'NHYQZX', 'energyinfo', 'calgary_information', 'oilgas_pro']
['cewoilgas', 'NHYQZX', 'energyinfo', 'calgary_information', 'oilgas_pro']
['cewoilgas', 'NHYQZX', 'energyinfo', 'calgary_information', 'oilgas_pro']
['cewoilgas', 'NHYQZX', 'energyinfo', 'calgary_information', 'oilgas_pro']

而且我还发现解决方案是:

htm = LH.fromstring(html)
for li in htm.xpath("//ul/li"):
    print li.xpath(".//p/label/text()")

结果是:

['cewoilgas']
['NHYQZX']
['energyinfo']
['calgary_information']
['oilgas_pro']

应该将其视为lxml的错误吗? 为什么xpath在子元素(li)下时仍通过整个根元素(ul)进行匹配?

不,这不是错误,而是预期的行为 如果以//开头表达式,则在树的根或树的任何元素上调用它都没关系-它将是绝对的,并且将从根应用它。

请记住,如果在元素上调用xpath()并希望它相对于该元素起作用,请始终以一个引用当前节点的点开头表达式。

顺便说一句, selenium绝对存在(双关语)相同的情况,它是find_element(s)_by_xpath()

//para选择文档根目录的所有para后代,并因此选择同一文档中的所有para元素作为上下文节点

//olist/item选择与上下文节点相同的文档中具有olist父级的所有item元素

. 选择上下文节点

.//para选择上下文节点的para元素后代

您可以在XML路径语言(XPath)中找到更多示例

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM