目標: 特定の要素 (例: li) からテキストを抽出し、さまざまな混合タグを無視します。つまり、最初のレベルの子をフラット化し、フラット化された各子の連結テキストを個別に返すだけです。
例:
<div id="mw-content-text"><h2><span class="mw-headline" >CIA</span></h2>
<ol>
<li>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>.</li>
</ol>
</Div>
ご希望のテキスト:
- アメリカ中央情報局
- カリナリー インスティテュート オブ アメリカ
周囲のアンカータグが単純な検索を妨げていることを除いて。
各 li タグを個別に返すには、次の簡単な方法を使用します。
//div[contains(@id,"mw-content-text")]/ol/li
ただし、周囲のアンカータグなども含まれます。
//div[contains(@id,"mw-content-text")]/ol/li/text()
li の直接の子であるテキスト要素、つまり 'Central','.'... のみを返します。
その場合、self と子孫のテキスト要素を探すのは理にかなっているように思われました
//div[contains(@id,"mw-content-text")]/ol/li[descendant-or-self::text]
しかし、それは何も返しません!
助言がありますか?私は Python を使用しているので、後処理に他のモジュールを使用することにオープンです。
(XPath 1.0 に準拠していると思われる Scrapy HtmlXPathSelector を使用しています)