2017-07-29 42 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