请参阅此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我想解析Monitor $300
和Keyboard $20
。我用这个xpath
//div[a[contains(., "Add to cart")]]/p/text()
但它选择了<span class="abc">Monitor</span> <b>$300</b>
。我不想要标签。我如何只获得文字?
答案 0 :(得分:25)
您想要选择所有后代文本,而不仅仅是子文本:
//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']