2017-07-29 75 views
0

我在从我的xpath列表中删除元素时遇到问题。
我是一个在Python和HTML刮的新手,所以忍耐着我:)
我读过nodes.getparent().remove(nodes)应该删除一个元素,但我甚至不能编译它。
因此,我似乎没有得到我需要能够删除的元素类型。
我可以毫无问题地拨打nodes.getparent(),但不能删除。从xpath树中删除元素不起作用

Error:

"TypeError: Argument 'element' has incorrect type (expected lxml.etree._Element, got 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) 
+0

什么是你最初的目标是什么?你想要你的脚本做什么? – Andersson

+1

您的XPath使用'text()'选择文本节点而不是元素节点,'remove'方法应该删除元素节点,而不是文本节点。此外,对于lxml和Python,文本节点的处理是特殊的,它们作为智能字符串返回,请参阅http://lxml.de/xpathxslt.html#xpath-return-values。至于你的问题,你能发表你正在解析的HTML代码片段,并解释你想删除哪些元素? –

+0

谢谢您的回复。清单看起来像这样: ['\ r \ n \ t \ t','AC','\ r \ n \ t \ t \ t','\ r \ n \ t \ t \ t \ t ','Ace','\ r \ n \ t \ t \ t \ t','Cobra','\ r \ n \ t \ t \ t \ t','\ r \ n \ t \ t \ t','\ r \ n \ t \ t','\ r \ n \ t \ t','阿尔法罗密欧',....例如, AC是Ace和Cobra的父母,Alfa Romeo是一位新的父母,等等。看看https://bilmodel.dk/Sitemap/Biler,我的意思就更明显了。所以我只是想以直观的方式来看这个列表,所以很容易搜索。 有可能是一个mucher更容易做到这一点,而不是我正在往下走的路径;) – JesperSR

回答

0

Question: I am not getting the element type that I need to be able to remove

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

例如:

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

Output:

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

测试使用Python 3.4.2

+0

谢谢你的回复,stovfl。当我运行你的代码时,我的列表并不像你的输出那样:S因此,你用“清除特殊文本节点”删除的东西是我的输出中仍然存在的文本? **输出:** A:B 'Ace ' A:B' Cobra ' A:B' 145' **测试与Python:3.6.0 ** – JesperSR

+0

@JesperSR:这是一样的,格式发布** HTML **必须为**代码**。阅读[当某人回答我的问题时该怎么办?](https://stackoverflow.com/help/someone-answers) – stovfl