2

フォローアップ:HTML XPath:複数のタグが混在するテキストを抽出しますか?

テストケースをより難しくしました:

<div id="mw-content-text"><h2><span class="mw-headline" >CIA</span></h2>
<ol>
<li><small>Military</small> Central <a href="/Intelligence_Agency.html">Intelligence Agency</a>.</li>
<li>Culinary <a href="/Institute.html">Institute</a> of <a href="/America.html">America</a>.<br/>Renowned cooking school.</li>
</ol>

</div>  

私には同じ目標があります。つまり、次のものを抽出します。

  • アメリカ中央情報局
  • カリナリーインスティテュートオブアメリカ

除外するタグを選択して選択できますか?

私は(「軍隊」を削除するために)次のようなことを試みました:

id('mw-content-text')/ol/li[not(self::small)]

ただし、その条件は「li」ノード全体に適用されるため、影響を受けません。

そして、私が似たようなことをすると

id('mw-content-text')/ol/li/*[not(self::small)]

次に、子供をフィルタリングするだけで、「Military」を正常に破棄しましたが、「Central」、「Culinary」、つまり親からのテキストも破棄しました。

私は木が次のようなものであることを理解していました:

div -- li  
          -- small -- Military  
          -- Central  
          -- a     -- Intelligence Agency  
    -- li  
          -- Culinary  
          -- a     -- Institute  
          -- of  
          -- a    -- America  
          -- br  
          -- Renowned cooking school.  

あれは正しいですか?「小さな子孫を除いて、liとliの子孫のテキスト要素」と言う方法はありますか?'... br要素とそれに続くすべてのテキスト要素を除いて'はどうですか?

繰り返しになりますが、(部分的な)Pythonicソリューションの使用も許容されますが、XPathが推奨されます。


ErikRayによる「LearningXML、Second Edition」の第6章「XPathとXPointer」を読んだ後、私はそれを理解したと思います。私は次の定式化を思いついた:

id('mw-content-text')/ol/li//text()[not(parent::small) and not(preceding-sibling::br)]

この場合、結果のテキストノードのノードセットを連結することはできないようです。'li'要素を文字列関数に単純にフィードすると、結果の文字列値は、要素ノードliの子孫を単純に連結したものになります。ただし、この場合は、さらにフィルタリングを行う必要があります。これにより、単一の要素ノードではなく、(修飾テキストノードの)ノードセットが生成されます。ノードセットの連結に関して、役立つSOの質問がここにあります。修飾する子ノード値の文字列連結を返すXPath

このソリューションを改善する方法について何かアドバイスはありますか?

4

1 に答える 1

2

使用

 /*/ol/li/descendant-or-self::*
          [text() and not(self::small)]
              /text()[not(preceding-sibling::br)]
于 2012-05-17T13:07:47.437 に答える