2017-07-29 5 views
0

Ich habe ein Problem beim Entfernen von Elementen aus meiner Xpath-Liste.
Ich bin ein Anfänger in Python und HTML-Scraping, also bitte mit mir :)
Ich habe gelesen, dass nodes.getparent().remove(nodes) sollte ein Element entfernen, aber ich kann nicht einmal kompilieren.
So scheint es, dass ich nicht den Elementtyp erhalte, den ich entfernen muss.
Ich kann nodes.getparent() ohne Probleme anrufen, aber nicht auf das entfernen.Element aus Xpath-Baum entfernen funktioniert nicht

Error:

"TypeError: Argument 'element' has incorrect type (expected lxml.etree._Element, got lxml.etree._ElementUnicodeResult)"

Mit freundlichen Grüßen
Jesper

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

was ist Ihr erstes Ziel? Was willst du mit deinem Skript? – Andersson

+1

Ihr XPath mit '// text()' wählt Textknoten und nicht Elementknoten, die 'remove' Methode soll Elementknoten entfernen, keine Textknoten. Bei lxml und Python ist die Behandlung von Textknoten besonders, sie werden als Smart Strings zurückgegeben, siehe http://lxml.de/xpathxslt.html#xpath-return-values. Was Ihr Problem betrifft, können Sie einen Ausschnitt des zu analysierenden HTML-Dokuments posten und erläutern, welche Elemente Sie entfernen möchten? –

+0

Vielen Dank für Ihre Antwort. Die Liste sieht ungefähr so ​​aus: ['\ r \ n \ t \ t', 'AC', '\ r \ n \ t \ t \ t', '\ r \ n \ t \ t \ t \ t ',' Ace ',' \ r \ n \ t \ t \ t \ t ',' Kobra ',' \ r \ n \ t \ t \ t \ t ',' \ r \ n \ t \ t \ t ',' \ r \ n \ t \ t ',' \ r \ n \ t \ t ',' Alfa Romeo ', .... Wo z AC ist ein Elternteil von Ace und Cobra, und Alfa Romeo ist ein neuer Elternteil usw. Wenn man auf https://bilmodel.dk/Sitemap/Biler schaut, ist es offensichtlicher, was ich meine. Also möchte ich diese Liste nur in einer intuitiven Art und Weise, so dass es leicht wäre, sie zu durchsuchen. Und es gibt wahrscheinlich eine Mucher einfachere Art, es zu tun, als der Pfad, den ich nach unten gehe;) – JesperSR

Antwort

0

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

Das Element, das Sie entfernen wollen, ist ein "spezieller Textknoten", anstatt sie zu entfernen, deaktivieren Sie es durch ein Blank '' zuweisen.

Zum Beispiel:

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

mit Python getestet: 3.4.2

+0

Vielen Dank für Ihre Antwort, stovfl. Wenn ich deinen Code ausführe, ist meine Liste jedoch nicht wie deine Ausgabe: S Also, die Dinge, die du mit "Clear special text nodes" entfernst, ist der Text, der noch in meiner Ausgabe vorhanden ist? ** Ausgang: ** a: b 'Ace ' a: b' Cobra ' a: b' 145' ** mit Python getestet: 3.6.0 ** – JesperSR

+0

@JesperSR: Es ist das gleiche, Formatieren von Problemen ** HTML ** muss als ** Code ** formatiert sein. Lesen Sie [Was soll ich tun, wenn jemand meine Frage beantwortet?] (Https://stackoverflow.com/help/someone-answers) – stovfl

Verwandte Themen