我正在尝试使用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)?
答案 0 :(得分:3)
不,这不是错误,而是预期的行为。如果你用//
开始你的表达式,如果你在树的根或树的任何元素上调用它并不重要 - 它将是绝对的并且它将从根应用。
请记住,如果在元素上调用xpath()
并且您希望它相对于此元素工作,请始终使用一个点来启动表达式,该点将引用当前节点。 / p>
顺便说一下,绝对(双关语意)同样发生在selenium
及其find_element(s)_by_xpath()
。
答案 1 :(得分:0)
中找到更多示例
//para
选择文档根目录的所有para后代 选择与上下文节点相同的文档中的所有para元素的上下文节点
//olist/item
选择同一文档中的所有项元素 具有olist父
.
选择上下文节点的para元素后代
.//para
选择上下文节点