【问题标题】:remove element from xpath tree not working从 xpath 树中删除元素不起作用
【发布时间】:2017-07-29 11:02:15
【问题描述】:

我在从 xpath 列表中删除元素时遇到问题。
我是 Python 和 HTML 抓取方面的新手,所以请耐心等待 :)
我读过nodes.getparent().remove(nodes) 应该删除一个元素,但我什至无法编译它。
所以看起来我没有得到我需要能够删除的元素类型。
我可以毫无问题地拨打nodes.getparent(),但不能删除。

错误:

“TypeError:参数‘元素’的类型不正确(预期为 lxml.etree._Element,得到 lxml.etree._ElementUnicodeResult)”

最好的问候
杰斯珀

from lxml import html
import requests

headers = {'User-Agent': 'Fiddler', 'Host': 'bilmodel.dk'}

page = requests.get('https://bilmodel.dk/Sitemap/Biler', headers=headers)
tree = html.fromstring(page.content)

#This will create a list of car brands
CarBrands = tree.xpath('//*[@id="content"]/ul[1]//text()')
for nodes in CarBrands:
    if nodes.find('\r\n\t\t\t\t') == 0:
        print('Found it')
        nodes.getparent().remove(nodes)

# Press Enter to exit window
#CarBrand = input('Write car brand:')
print(CarBrands)

【问题讨论】:

  • 你最初的目标是什么?你想让你的脚本做什么?
  • 带有//text() 的XPath 选择文本节点而不是元素节点,remove 方法应该删除元素节点,而不是文本节点。此外,对于 lxml 和 Python,文本节点的处理是特殊的,它们作为智能字符串返回,请参阅 lxml.de/xpathxslt.html#xpath-return-values。至于您的问题,您能否发布您正在解析的 HTML 的 sn-p 并说明您要删除哪些元素?
  • 感谢您的回复。该列表如下所示: ['\r\n\t\t', 'AC', '\r\n\t\t\t', '\r\n\t\t\t\t' , '王牌', '\r\n\t\t\t\t', '眼镜蛇', '\r\n\t\t\t\t', '\r\n\t\t\t ', '\r\n\t\t', '\r\n\t\t', '阿尔法罗密欧',.... AC 是 Ace 和 Cobra 的父母,Alfa Romeo 是新父母,等等。看看bilmodel.dk/Sitemap/Biler,我的意思就更明显了。所以我只是想以一种直观的方式列出这个列表,这样很容易搜索。而且可能有一种比我要走的路更简单的方法;)

标签: python xpath lxml


【解决方案1】:

问题:我没有得到需要删除的元素类型

您要删除的元素是“特殊文本节点”,而不是删除,通过分配空白'' 将其清除。

例如:

# Get all <li> inside <ul>[1]
 CarBrands = tree.xpath('//*[@id="content"]/ul[1]/li')

# Iterate all <li> Nodes
for node in CarBrands:
    # Findall <ul><li>...</li> ...
    li_nodes = node.findall('./ul/li')

    # Iterate all <li>
    for li in li_nodes:
        # Find the <a> inside <li>
        a = li.find('./a')

        # Clear "special text nodes"
        a.tail = ''
        print('a:{}'.format(etree.tostring(a)))

输出

a:b'<a href="/Biler/AC/Ace/">Ace</a>'  
a:b'<a href="/Biler/AC/Cobra/">Cobra</a>'  

用 Python 测试:3.4.2

【讨论】:

  • 感谢您的回复,stovfl。但是,当我运行您的代码时,我的列表与您的输出不同:S 因此,您使用“清除特殊文本节点”删除的内容是仍然存在于我的输出中的文本? 输出: a:b'Ace' a:b'Cobra' a:b'145' 用 Python 测试:3.6.0
  • @JesperSR:同样,Formatting Issue HTML 必须格式化为 Code。阅读What should I do when someone answers my question?
猜你喜欢
  • 2012-05-10
  • 2013-02-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多