繁体   English   中英

python3和urllib3中的编码问题

[英]issues with encoding in python3 and urllib3

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

只需编码您的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')

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

该代码的一些无关提示:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM