誰かが、要素の特定の修飾子ノードの連結された値を含む文字列値を返し、他は無視する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式で可能ですか?
ありがとう。
XPath 1.0では:
使用できます
/div//text()[not(parent::p)]
必要なテキストノードをキャプチャします。連結自体はXPath 1.0では実行できません。ホストアプリケーションで実行することをお勧めします。
XPath 2.0の場合:
string-join(/*/node()[not(self::p)], '')
機能するこの外観:
コンテキストとして使用/div/
:
text() | em/text()
またはコンテキストを使用せずに:
/div/text() | /div/em/text()
最初の2つの文字列を連結する場合は、次のようにします。
concat(/div/text(), /div/em/text())
/div//text()
中間ノードに関係なく、ダブルスラッシュでテキストを抽出します
私はこれが少し遅れることを知っていますが、私の答えはまだ関連性があると思います。最近、同様の問題に遭遇しました。また、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.