2017-07-29 16 views
0

xpathリストから要素を削除する際に問題があります。
私はPythonで新人ですので、私はクマと一緒にくつろいでください。
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

'// text()'のXPathは要素ノードではなくテキストノードを選択しますが、 '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 '、'エース '、' \ 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 '、' Alfa Romeo 'など。 ACはAceとCobraの親であり、Alfa Romeoは新しい親などです。https://bilmodel.dk/Sitemap/Bilerを見ると、私の言葉がはっきりしています。だから私はこのリストを強烈な方法で欲しがるので、検索するのは簡単だろう。 そして、おそらく私が下っている道よりももっと簡単なやり方があります; – JesperSR

答えて

0

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

削除したい要素は空白''を割り当てることで、それをクリア代わりに除去する "特殊なテキストノード"、です。例えば

のPythonでテスト
# 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>' 

:3.4.2

+0

あなたの返事ありがとう、stovfl。私はあなたのコードを実行するとき、私のリストはあなたの出力のようなものではありません:Sそれでは、 "Clear special text nodes"を使って削除するものは、出力にまだ残っているテキストですか? **出力:** :B 'Ace ' :B' Cobra ' :B' 145' **パイソンでテスト:3.6.0 ** – JesperSR

+0

@JesperSR:それは同じですが、フォーミングの問題** HTML **は**コード**として作成する必要があります。 [誰かが私の質問に答えたときに何をすべきですか?](https://stackoverflow.com/help/someone-answers) – stovfl

関連する問題