如何删除lxml.etree._Element前2个元素且不转列表以正常使用XPath
问题原因
直接对lxml.etree._Element类型对象执行切片操作,返回的是子节点组成的Python原生列表,列表本身没有xpath方法,自然会抛出属性错误。
解决方案
方案1:直接删除目标元素的前2个子节点
该方案会修改原p元素的结构,适合后续需要用到修改后p元素的场景:
root = etree.HTML(res.text) p = root.xpath('//div[@id="J"]/p') target_p = p[0] # 遍历删除前2个子节点,原对象仍为Element类型 for child in target_p.getchildren()[:2]: target_p.remove(child) # 正常调用xpath方法 p_content = target_p.xpath('string(.)')
方案2:通过XPath语法直接过滤前2个节点,无需修改原对象
该方案不会改动原元素结构,仅在提取内容时跳过前2个子节点,更轻量化:
root = etree.HTML(res.text) p = root.xpath('//div[@id="J"]/p') # position()从1开始计数,position()>2就跳过前2个节点,直接提取目标内容 # 仅过滤元素节点可将node()替换为* p_content = p[0].xpath('string(./node()[position()>2])')
内容的提问来源于stack exchange,提问作者Trinidad
相关产品推荐
相关产品推荐

