【问题标题】:issues with encoding in python3 and urllib3python3和urllib3中的编码问题
【发布时间】:2014-11-09 22:48:54
【问题描述】:

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

【问题讨论】:

  • 你有一些示例网址吗?
  • "问题出来了" 究竟是什么问题?有错误吗?它是什么?在哪条线上?

标签: python python-3.x encoding beautifulsoup urllib3


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    该代码的一些无关提示:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-06-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-20
      • 1970-01-01
      • 2021-07-08
      • 1970-01-01
      相关资源
      最近更新 更多