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

时间:2016-12-22 07:32:13

标签: python html xpath lxml

我正在尝试使用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中的子元素:

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)?

2 个答案:

答案 0 :(得分:3)

不,这不是错误,而是预期的行为。如果你用//开始你的表达式,如果你在树的根或树的任何元素上调用它并不重要 - 它将是绝对的并且它将从根应用。

请记住,如果在元素上调用xpath()并且您希望它相对于此元素工作,请始终使用一个点来启动表达式,该点将引用当前节点。 / p>

顺便说一下,绝对(双关语意)同样发生在selenium及其find_element(s)_by_xpath()

答案 1 :(得分:0)

  

//para选择文档根目录的所有para后代   选择与上下文节点相同的文档中的所有para元素

     

//olist/item选择同一文档中的所有项元素   具有olist父

的上下文节点      

.选择上下文节点

     

.//para选择上下文节点

的para元素后代

您可以在XML Path Language (XPath)

中找到更多示例