web-dev-qa-db-ja.com

修飾子ノード値の文字列連結を返すXPath

誰かが、要素の特定の修飾子ノードの連結された値を含む文字列値を返し、他は無視するXPath式形式を提案できますか?

<div>
    This text node should be returned.
    <em>And the value of this element.</em>
    And this.
    <p>But this paragraph element should be ignored.</p>
</div>

戻り値は単一の文字列でなければなりません:

This text node should be returned. And the value of this element. And this.

これは単一のXPath式で可能ですか?

ありがとう。

22
Tim Coulter

XPath 1.0では:

使用できます

/div//text()[not(parent::p)]

必要なテキストノードをキャプチャします。連結自体はXPath 1.0では実行できません。ホストアプリケーションで実行することをお勧めします。

19
Tomalak

XPath 2.0の場合

string-join(/*/node()[not(self::p)], '')

27

機能するこの外観:

コンテキストとして使用/div/

text() | em/text()

またはコンテキストを使用せずに:

/div/text() | /div/em/text()

最初の2つの文字列を連結する場合は、次のようにします。

concat(/div/text(), /div/em/text())
6
eLZahR
/div//text()

中間ノードに関係なく、ダブルスラッシュでテキストを抽出します

6
Dewfy

私はこれが少し遅れることを知っていますが、私の答えはまだ関連性があると思います。最近、同様の問題に遭遇しました。また、Python 3.6でscrapyを使用しているため、xpath 2.0をサポートしていないため、string-join関数は、いくつかのオンライン回答で提案されています。

私は、Stackoverflowの回答のいずれにも見られなかった(以下に示す)簡単な回避策を見つけたので、それを共有します。

temp_selector_list = response.xpath('/div')
string_result = [''.join(x.xpath(".//text()").extract()) for x in temp_selector_list]

お役に立てれば!

P以外のすべての子が必要な場合は、以下を試すことができます...

    string-join(//*[name() != 'p']/text(), "")

戻る...

This text node should be returned.
And the value of this element.
And this.
0