ScrapyのXPathセレクタの使用プレーンテキストまたは書式設定されたHTMLコンテンツを含むdiv要素のテキストコンテンツを平坦化しようとしています。ここでは2つの例を示します。特定のノードを除いたXPathの平坦化されたテキスト
<div>
<div itemprop="content">
Lorem ipsum dolor sit amet, consectetur adipiscing elit.
<br>
Donec fringilla est eu euismod varius.
</div>
<div itemprop="content">
<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit.</p>
<p>Donec fringilla est eu euismod varius.</p>
<p class="quote">
<span>Quote</span>
<a href="#">Exclude me</a>
<ul>
<li>Exclude me</li>
<li>Exclude me</li>
</ul>
</p>
<blockquote>Cras facilisis suscipit euismod.</blockquote>
</div>
</div>
今の目標は、それだけで、それを次ための視覚的な手掛かりとなって平らにテキストで<p class="quote">Quote</p>
を省略することです。最初の例の性質のために、選択したdiv
の直接の子としてすなわち、テキスト、次のように私はルックスを作ってみた解決策:
//div[@itemprop="content"]/descendant-or-self::*[not(self::script)]/text()[normalize-space()]
は、これは3つのことを実現:
- は除外します
<script>
ノードを私の結果に含めたくないからです。 - テキストを含まないノードを除外します。
- トップレベル
div
の直筆の子供を含む(descendant-or-self
経由)。<div itemprop="content">
が期待される出力のようなリストであるノード上で//div[@itemprop="content"]/descendant-or-self::*[not(self::script) and not(@class="quote")]/text()[normalize-space()] //div[@itemprop="content"]/descendant-or-self::*[not(self::script)]/text()[normalize-space() and not(ancestor::*[@class="quote"])]
反復処理:
は、残念ながら後者が<p class="quote">Quote</p>
を引き起こしているような追加を除くフィルタ、のにもかかわらず、含まれるように私には思えます。
['Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec fringilla est eu euismod varius.',
'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec fringilla est eu euismod varius. Cras facilisis suscipit euismod.']
単一のXPathセレクタでこの問題を解決する方法はありますか?
'// divの[@にitemprop = "コンテンツ"]あなたのサンプル入力で私のために働いた/ descendant-or-self :: * [not(self :: script)ではなく(@ class = "quote")]/text()[normalize-space()] '何を手に入れていますか?出力として何を期待していますか? (あなたはこれらの答えで質問を更新できます) –
こんにちはポール、それを指摘してくれてありがとう!私の入力例は問題を正しく表していませんでした。私が除外したいノードには、私が除外しなければならない追加の子供がいます。例を与えるために、私は -childと '' '
' ''にリストを追加しましたが、ここではどのような形の子でも構いません。 – oschlueter