17

目標: 特定の要素 (例: 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 を使用しています)

4

3 に答える 3

26

あなたはほとんどそこにいました。に小さな問題があります:

//div[contains(@id,"mw-content-text")]/ol/li[descendant-or-self::text]

修正された表現は次のとおりです。

//div[contains(@id,"mw-content-text")]/ol/li[descendant-or-self::text()]

ただし、指定された の下にあるすべてのテキストノードの必要な連結を正確に生成する、より単純な式がありますli

string(//div[contains(@id,"mw-content-text")]/ol/li)
于 2012-05-16T12:48:53.723 に答える
5

以下は正しい結果を返すと思います:

//div[contains(@id,"mw-content-text")]/ol/li//text()

text() の前の二重スラッシュに注意してください。これは、li より下の任意のレベルのテキスト ノードを返す必要があることを意味します。

于 2012-05-16T12:28:35.100 に答える
2

文字列の連結はトリッキーです。を使用した簡単な解決策は次のlxmlとおりです。

>>> from lxml import etree
>>> doc = etree.HTML("""<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>""")
>>> for element in doc.xpath('//div[@id="mw-content-text"]/ol/li'):
...   print "".join(element.xpath('descendant-or-self::text()'))
...
Central Intelligence Agency.
Culinary Institute of America.

パフォーマンスが低下したり、意図しない実行が行われる可能性があることに注意し//てください。可能な場合は避ける必要がありますが、例の HTML フラグメントではそれが困難です。

于 2012-05-16T12:26:06.620 に答える