2012-01-05 10 views
3

私は、ページからテキストを抽出するScrapyスパイダーを作成しました。スパイダーは、多くのページで正しく解析して出力しますが、いくつかは取り除かれています。ドキュメント内で改行や書式設定を維持しようとしています。このようhttp://www.state.gov/r/pa/prs/dpb/2011/04/160298.htmなどのページは、同様に適切にフォーマットされていますPythonでScrapyで解析する際に改行を保存する

2011年4月7日

マーク・C.トナー

2時03分〜午後EDT

MR。トーナー:皆さん、こんにちは。一番上のものは、 です。それから、私はあなたの質問を受け取ります。我々は、可能な限り最強の条件でイスラエル南部の無実の 市民に対する攻撃を非難し、またガザからの継続的なロケット火災として を非難する。我々は何度も繰り返してきたので、無実の民間人を対象とした妥当性はないと、 これらのテロ行為の責任者は、 の責任を負います。我々は特に、 民間人に対する攻撃で先進的な対戦車武器を使用し、すべての国が武器と弾薬の不正取引を防止するための関連する国連安全保障理事会の決議に基づいて義務を負うことを再確認する報告を懸念している。また、簡単な文章 -

質問:ちょっと待ってもらえますか?

MR。 TONER:そうです。先に、マット。

質問:明らかに、そのターゲットはスクールバスでした。その があなたの怒りに追加されますか?

MR。 TONER:まあ、無実の民間人に対するどんな攻撃も嫌ですが、確かに攻撃の性質は特にそうです。 。

http://www.state.gov/r/pa/prs/dpb/2009/04/121223.htmのようなページがありません行で、このような出力を有するが壊れる:

2009年4月2日

ロバート・ウッド

11:53午前EDTMR。ウッド:おはようございます。まだ朝は約 と思う。ブリーフィングへようこそ。私は、何も持ってdon,Äôt ので、AI sir.QUESTION:北朝鮮がタンカーに拍車をかけて移動、または ているサイトに近いものは何でも、。彼らはこの ミサイルに燃料を供給している場合としていない場合があります。今朝、北朝鮮人のためにあなたは知恵の言葉を持っていますか。 ?ウッド:まあ、マット、私はあなたに言及するつもりはない、あなたは 知っている、情報の問題です。しかし、もう一度言わせてください、北朝鮮はどんなタイプのミサイルも発射することを断念するために北朝鮮に電話します( )。これは逆効果の です。それは挑発的です。それはさらに 地域の緊張を高めます。私たちは、北朝鮮が戻って六者 枠組みに取得し、denuclearization.Yes.QUESTIONに焦点を当てて見たい:日本も が、これはすべき、あなたが知っている、they,Äôreセキュリティ 理事会で緊急会議を要請する予定としています立ち上げを進めてください。 こちらの商品もお持ちですか?ウッド:さて、このテストが 起こるかどうかを見てみましょう。私たちは確かにそれがうまくいかないことを願っています。再び北朝鮮に電話してください。 それをしないでください。しかし確かに、私たちは、もしその試験が進まなければ、 私たちは同盟国と議論しています。

次のように私が使用しているコードは次のとおりです。

def parse_item(self, response): 
    self.log('Hi, this is an item page! %s' % response.url) 

    hxs = HtmlXPathSelector(response) 

    speaker = hxs.select("//span[contains(@class, 'official_s_name')]") #gets the speaker 
    speaker = speaker.select('string()').extract()[0] #extracts speaker text 
    date = hxs.select('//*[@id="date_long"]') #gets the date 
    date = date.select('string()').extract()[0] #extracts the date 
    content = hxs.select('//*[@id="centerblock"]') #gets the content 
    content = content.select('string()').extract()[0] #extracts the content 

    texts = "%s\n\n%s\n\n%s" % (date, speaker, content) #puts everything together in a string 

    filename = ("/path/StateDailyBriefing-" + '%s' ".txt") % (date) #creates a file using the date 

    #opens the file defined above and writes 'texts' using utf-8 
    with codecs.open(filename, 'w', encoding='utf-8') as output: 
     output.write(texts) 

私は、彼らが問題はページのHTMLの書式設定にあると思います。テキストを正しく出力しないページでは、段落は<br> <p></p>で区切られ、段落は正しく出力されるページでは<p align="left" dir="ltr">に格納されます。だから、私はこれを特定したが、すべての出力を正しい形式で一貫して出力する方法がわからない。

答えて

6

問題は、あなたがtext()string()を取得するとき、<br>タグは改行に変換されていないということです。

回避策 - XPath要求を行う前に<br>タグを置き換えてください。コード:

response = response.replace(body=response.body.replace('<br />', '\n')) 
hxs = HtmlXPathSelector(response) 

そして、あなたが知っている場合のみ、1ノードが存在することを、あなたの代わりにtext()string()を使用することができ、私はいくつかのアドバイスを与えてみましょう:

date = hxs.select('//*[@id="date_long"]/text()').extract()[0] 
+0

私は平凡な文字列を正規表現で置換することを推奨します。 'response = response.replace(body = re.sub(r" "、" \ n "、response.body))' – Guillaume

3

は、このXPathを試してみてください:

//*[@id="centerblock"]//text() 
+0

あなただけの '「」することができません'' \ n '.join(content) 'はパラグラフだけでなく' ...'も分割するので、.join(content) – reclosedev

+0

これは動作しますが、リストに参加する必要があるため、@reclosedevはよりクリーンで簡単なメソッドを持っています。ありがとう、結構です。 – user1074057

関連する問題