0

我正在尝试编写一个 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

只需对您的文件进行编码string并写入文件,如下所示:

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

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

所以,在你的情况下,也许你需要改变:

fp.write(xml+ '\n')

对此:

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

没有例子,很难说。听起来您正在解码非 UTF8 文本(可能是 ISO-8859-1),或者 BS 正在根据文档的元数据(或猜测)对其进行重新解码。

该代码的一些不相关的提示:

  • 小心使用纯字符串编写 XML。您至少应该转义它(如果v_descriptionv_link包含>,等<&您将创建无效的 XML)。更好的是 - 以编程方式构建 XML(请参阅:生成 xml 的最佳方式?
  • 在较新的 Python 中,您可以使用该with构造来确保您的文件(自动)关闭。
  • 不要使用 + 在 Python 中构造字符串 - 使用模板,例如使用string.Formatter。它更快,更具可读性。
于 2014-11-09T23:32:09.533 回答