6

現在、scrapy を使用して多数のスパイダーをセットアップしています。これらのスパイダーは、ターゲット サイトからテキスト(記事、フォーラムの投稿、段落など) のみを抽出することになっています。

問題は、ターゲットノードに<script>タグが含まれているため、スクレイピングされたテキストに JavaScript コードが含まれている場合があることです。

これは、私が取り組んでいるものの実際の例へのリンクです。この場合、ターゲット ノードは//td[@id='contenuStory']です。問題は<script>、最初の子 div にタグがあることです。

Web と SO で解決策を探すのに多くの時間を費やしましたが、何も見つかりませんでした。明らかな何かを見逃していないことを願っています!

HTML 応答 (対象ノードのみ) :

<div id="content">
    <div id="part1">Some text</div>
    <script>var s = 'javascript I don't want';</script>
    <div id="part2">Some other text</div>
</div>

私が欲しいもの :

Some text
Some other text

私が得るもの:

Some text
var s = 'javascript I don't want';
Some other text

私のコード

xpath セレクターが与えられた場合、次の関数を使用してテキストを抽出しています。

def getText(hxs):
    if len(hxs) > 0:
        l = hxs.select('string(.)')
        if len(l) > 0:
            s = l[0].extract().encode('utf-8')
        else:
            s = hxs[0].extract().encode('utf-8')
        return s
    else:
        return 0

XPath軸(のようなものchild::script)を使用してみましたが、役に立ちませんでした。

4

3 に答える 3

1

次の XPath 式を試すことができます。

hxs.select('//td[@id="contenuStory"]/descendant-or-self::*[not(self::script)]/text()').extract()

//td[@id='contenuStory']つまり、ノードではない子孫のすべての子テキストscriptノード

テキスト ノード間にスペースを追加するには、次のようなものを使用できます。

u' '.join(
    hxs.select(
        '//td[@id="contenuStory"]/descendant-or-self::*[not(self::script)]/text()').extract()
)
于 2013-11-04T23:26:14.210 に答える