0

さまざまな Web サイトからニュースを自動的に取得するのに役立つ Python プログラムを作成しようとしています。現時点では、python3 と Beautifulsoup4 および urllib3 を使用して、リモート ページを取得して解析しています。

このページからテキストを読み込もうとすると、À à é ó... などの非 ASCII 文字が含まれているため、問題が発生します。

ページを取得して変数に入れ、ファイルに書き込む直後にutf-8からページをデコードしようとしましたが、成功しませんでした...そして、この問題にアプローチする別の方法を読んだ後でも、私は理解できませんでした実用的なソリューション。

あなたの誰かが私と同じ状況にあったかどうか疑問に思っていました..

これが私のコードです

# -*- coding: utf-8 -*-
from bs4 import BeautifulSoup
import urllib3

http = urllib3.PoolManager()
req = http.request('GET', 'http://www.....')
page = req.data.decode('utf-8')
soup = BeautifulSoup(page)

elements = soup.find_all('div', class_='content')

fp = open('results.xml', 'a')

for element in elements:
  link  = element.find('a')
  descr = element.find('div', class_='description')

  v_link  = u'%s' % link.get('href')
  v_description = u'%s' % descr.text

  xml = "<news>\n"
  xml = xml+ "  <description>"+ v_description+ "</description>\n"
  xml = xml+ "  <page_link>"+ v_link+ "</page_link>\n"
  xml = xml+ "</news>\n"

  fp.write(xml+ '\n')

#END FOR LOOP

fp.close()
4

2 に答える 2

0

例がなければ、なんとも言えません。UTF8 以外のテキスト (おそらく ISO-8859-1) をデコードしている、または BS がドキュメントのメタデータ (または推測) に基づいて再デコードしているようです。

そのコードに関するいくつかの無関係なヒント:

  • プレーンな文字列を使用して XML を記述する場合は注意してください。少なくともエスケープする必要があります( 、 などが含まれている場合、v_description無効v_linkなXMLが作成されます)。さらに良い - プログラムで XML を構築します (「xml を生成する最良の方法」を参照してください) 。><&
  • 新しい Python では、withコンストラクトを使用して、ファイルが (自動的に) 閉じられるようにすることができます。
  • + を使用して Python で文字列を作成しないでください。たとえば、string.Formatterを使用してテンプレートを使用してください。より速く、より読みやすくなっています。
于 2014-11-09T23:32:09.533 に答える
0

次のように、エンコードstringしてファイルに書き込むだけです。

desc = 'À à é ó...and so on...'.encode('utf-8')
with open('utf8.xml', 'a') as f:
    f.write(desc)

cat utf8.xml
À à é ó...and so on...

SO、あなたの場合、おそらく変更する必要があります:

fp.write(xml+ '\n')

これに:

fp.write(xml.encode('utf-8') + '\n')
于 2014-11-09T23:05:37.710 に答える