0

Scrapy でオブジェクトを使用してHtmlXPathSelector(response)います。2 種類のテキスト形式を取得する必要があります。

私の最初のテキストは次の形式です。

<p> Text, text, text, text, text, text, text, text, text </p>
<p>
<p> Text, text, text, text, text. </p>

2 番目のテキストの形式は次のとおりです。

Text, text, text, text, text, text
<br>
<br>
Text, text, text..
<br>
<br>

x.select('//div[@id="texto"]/text()').extract()2番目ではなく使用すると...次のようなものが得られます。

'content': [u'\r\n          ',
                 u'\r\n',
                 ...
                 u'\r\n']

私が使用するx.select('//div[@id="texto"]/p/text()').extract()と、最初のものではなく2番目のものを取得します:

両方の形式を取得するために、一種のルールを使用するにはどうすればよいですか?

アップデート:

次のコードで解決策が得られますが、汚い解決策だと思います。

content = x.select('//div[@id="nota_texto"]/p/text()').extract()
if content == []:
    data['content'] = x.select('//div[@id="nota_texto"]/text()').extract()
else:
    data['content'] = content

更新 2:

二重スラッシュ//を使用しても問題ありませんが、HTML には次の形式があるため、テーブルの内容を取得しています。

<div id="texto">
      <table>
        Undesired content
      </table>
       Desired content.
</div>

「望ましくないコンテンツ」を取得しないようにするにはどうすればよいですか?

更新 3:

Scrapy ユーザーの Google グループで、Steven Almeroth から回答を受け取りました。

次の兄弟を使用します。

x.select('id("texto")/table/following-sibling::node()').extract()

できます!

4

2 に答える 2

1

次の Xpath クエリを試してください。

string(//div[@id="texto"])
于 2012-11-06T10:31:42.293 に答える
1

ID「texto」とそのすべての子を持つdiv内のすべてのテキストが必要ですか?
その場合、これは機能するはずです:

x.select('//div[@id="texto"]//text()').extract()


それが一般的すぎる場合は、|演算子を使用して複数の xpath を一致させることができます。

'<xpath1>|<xpath2>'

編集:

'//text()' xpath が必要以上のものを取得する場合は、より具体的にする必要があります。
ここで の|出番です。次のようなものを試してください。

x.select('//div[@id="texto"]/text() | //div[@id="texto"]/p/text()')
于 2012-11-05T23:03:28.540 に答える