[英]How to select only certain tag and text using xpath?
例如,html塊:
<p><b>text1</b> (<span><a href="#1">asdf</a>text2</span>)</p>
我需要選擇所有標簽“ a”,所有其余標簽必須為純文本,就像我們在瀏覽器中看到的那樣:
result = ["text1", " (", <tag_a>, "text2", ")"]
或類似的東西。
嘗試過:
hxs.select('.//a|text()')
在這種情況下,它將找到所有標記“ a”,但僅從直接子代返回文本。
與此同時:
hxs.select('.//text()|a')
獲取所有文本,但標記“ a”僅來自直接子代。
更新
elements = []
for i in hxs.select('.//node()'):
try:
tag_name = i.select('name()').extract()[0]
except TypeError:
tag_name = '_text'
if tag_name == 'a':
elements.append(i)
elif tag_name == '_text':
elements.append(i.extract())
有沒有更好的辦法?
在我看來,您似乎正在超越XPath領域。 XPath擅長從輸入中選擇內容,而不擅長構建輸出。 當然,它是為與XSLT一起使用而設計的,其中XSLT指令處理輸出端。 我不確定Python會是什么。
這是您要找的東西嗎?
您可以使用etree.strip_tags
從塊中刪除后代標簽
from lxml import etree
d = etree.HTML('<html><body><p><b>text1</b> (<span><a href="#1">asdf</a>text2</span>)</p></body></html>')
block = d.xpath('/html/body/p')[0]
# etree.strip_tags apparently takes a list of tags to strip, but it wasn't working for me
for tag in set(x.tag for x in block.iterdescendants() if x.tag != 'a'):
etree.strip_tags(block,tag)
block.xpath('./text()|a')
產量:
['text1', ' (', <Element a at fa4a48>, 'text2', ')']
這些相對的 XPath表達式:
.//text()|.//a
要么
.//node()[self::text()|self::a]
含義 : 所有后代文本節點或上下文節點中a
元素。
注意 :節點設置結果是否按文檔順序排序取決於主機語言或XPath引擎。 根據定義,節點集是無序的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.