2013-01-31 17 views
16

は、このHTML私はMonitor $300Keyboard $20を解析するXPathを使用しXPathを使用してHTML要素のテキストコンテンツを取得しますか?

<div> 
    <p> 
    <span class="abc">Monitor</span> <b>$300</b> 
    </p> 
    <a href="/add">Add to cart</a> 
</div> 
<div> 
    <p> 
    <span class="abc">Keyboard</span> $20 
    </p> 
    <a href="/add">Add to cart</a> 
</div> 

を参照してください。私は、このXPathの

//div[a[contains(., "Add to cart")]]/p/text() 

を使用する。しかし、それは、<span class="abc">Monitor</span> <b>$300</b>を選択します。私はタグを望んでいない。テキストのみを取得するには?あなたはすべての子孫テキストだけでなく、子テキスト選択したい

+0

'text()'は要素を決して選択しないでください。どのXMLパーサーを使用していますか? – choroba

+0

@choroba 'scrapy.selector.lxmlsel.HtmlXPathSelector' –

+0

どのように値にアクセスしますか? DOM Level 3の単語では、例えば '' p ''要素を選択します。 '/// div [a [("カートに入れる ")]]/p'を実行し、次に' textContent'プロパティにアクセスしてプレーンテキストの内容を取得します。 –

答えて

22

//div[a[contains(., "Add to cart")]]/p//text() 

pとそこtext()の間に二重スラッシュを入力してください。

これは潜在的に多くのタグ間空白も含みますが、あなたはそれをきれいにする必要があります。使用例lxml

>>> import lxml.etree as ET 
>>> tree = ET.fromstring('''<div> 
... <div> 
...  <p> 
...  <span class="abc">Monitor</span> <b>$300</b> 
...  </p> 
...  <a href="/add">Add to cart</a> 
... </div> 
... <div> 
...  <p> 
...  <span class="abc">Keyboard</span> $20 
...  </p> 
...  <a href="/add">Add to cart</a> 
... </div> 
... </div>''') 
>>> tree.xpath('//div[a[contains(., "Add to cart")]]/p//text()') 
['\n ', 'Monitor', ' ', '$300', '\n ', '\n ', 'Keyboard', ' $20 \n '] 
>>> res = _ 
>>> [txt for txt in (txt.strip() for txt in res) if txt] 
['Monitor', '$300', 'Keyboard', '$20'] 
+4

うわー!その二重 '/'は私の日を節約します –

+0

私は空白を削除するために全く同じコードを使用します。 –

+1

あなたのために働いてくれてうれしいです。 :-)私は、空白がどこから来ているのか、そしてそれをどのように掃除するのかを理解していただけです。 –

関連する問題