簡體   English   中英

如何使用xpath僅選擇某些標簽和文本?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM