[英]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.