1

以下のすべての要素からすべてのテキストを 1 つの文字列で返すクエリを作成するのは非常に困難です(ページ上の他のすべての要素にもテキストが含まれており、spanまたはdiv要素ではないと仮定します)

注: 私は PHP XPath エンジンを使用しているため、XPath 1.0 のソリューションを使用せざるを得ません。

HTML

<div>Hello</div>
<div>World</div>
<div>!!!</div>
<span>This</span>
<span>is</span>
<span>cool</span>

XPath

normalize-space(//*/div | //*/span)

望ましい出力:

Hello World!!! This is cool

提案をいただければ幸いです。よろしくお願いします!

4

4 に答える 4

1

要素間にはすでにスペースがあるため、選択したものに含める限り、スペースを追加する必要はありません。文字列を予期するものにノード セットを渡すと、XPath はすべての子孫テキスト ノードをドキュメント順に連結するだけで、ノード セットを文字列に変換します。したがって、コンテキスト ノードがこれらすべてのdivandspan要素の親である場合、最も単純な式は次のとおりです。

normalize-space(.)
于 2013-07-17T14:02:19.520 に答える
0

lxml で EXSLT 文字列拡張機能を使用する (Python) http://www.exslt.org/str/str.html

str:replace(str:concat(//text()), "\n", " ")

またはさらに単純な

normalize-space(str:concat(//text()))

Python シェルでテスト済み

>>> import lxml.etree
>>> import lxml.html
>>> doc="""<div>Hello</div>
... <div>World</div>
... <div>!!!</div>
... <span>This</span>
... <span>is</span>
... <span>cool</span>"""
>>> root = lxml.etree.fromstring(doc, parser=lxml.html.HTMLParser())
>>> root.xpath('str:replace(str:concat(//text()), "\n", " ")', namespaces={"str": "http://exslt.org/strings"})
'Hello World !!! This is cool'
>>> root.xpath('normalize-space(str:concat(//text()))', namespaces={"str": "http://exslt.org/strings"})
'Hello World !!! This is cool'
>>> 
于 2013-07-17T13:45:26.580 に答える