Python - 从网站抓取数据时重音字符的问题

2023-12-30

我是 Nicola,一名 Python 新用户,没有真正的计算机编程背景。因此,我确实需要一些帮助来解决我遇到的问题。我编写了一段代码来从此网页抓取数据:

基本上,我的代码的目标是从页面中的所有表中抓取数据并将它们写入 txt 文件中。 这里我粘贴我的代码:

#!/usr/bin/env python


from mechanize import Browser
from BeautifulSoup import BeautifulSoup
import urllib2, os


def extract(soup):
table = soup.findAll("table")[1]
for row in table.findAll('tr')[1:19]:
        col = row.findAll('td')
        voce = col[0].string
        accertamento = col[1].string
        competenza = col[2].string
        residui = col[3].string
        record = (voce, accertamento, competenza, residui)
        print >> outfile, "|".join(record)

table = soup.findAll("table")[2]
for row in table.findAll('tr')[1:21]:
        col = row.findAll('td')
        voce = col[0].string
        accertamento = col[1].string
        competenza = col[2].string
        residui = col[3].string
        record = (voce, accertamento, competenza, residui)
        print >> outfile, "|".join(record)

table = soup.findAll("table")[3]
for row in table.findAll('tr')[1:44]:
        col = row.findAll('td')
        voce = col[0].string
        accertamento = col[1].string
        competenza = col[2].string
        residui = col[3].string
        record = (voce, accertamento, competenza, residui)
        print >> outfile, "|".join(record)

table = soup.findAll("table")[4]
for row in table.findAll('tr')[1:18]:
        col = row.findAll('td')
        voce = col[0].string
        accertamento = col[1].string
        competenza = col[2].string
        residui = col[3].string
        record = (voce, accertamento, competenza, residui)
        print >> outfile, "|".join(record)

    table = soup.findAll("table")[5]
for row in table.findAll('tr')[1:]:
        col = row.findAll('td')
        voce = col[0].string
        accertamento = col[1].string
        competenza = col[2].string
        residui = col[3].string
        record = (voce, accertamento, competenza, residui)
        print >> outfile, "|".join(record)

    table = soup.findAll("table")[6]
for row in table.findAll('tr')[1:]:
        col = row.findAll('td')
        voce = col[0].string
        accertamento = col[1].string
        competenza = col[2].string
        residui = col[3].string
        record = (voce, accertamento, competenza, residui)
        print >> outfile, "|".join(record)


outfile = open("modena_quadro02.txt", "w")
br = Browser()
br.set_handle_robots(False)
url = "http://finanzalocale.interno.it/sitophp/showQuadro.php?codice=2080500230&tipo=CO&descr_ente=MODENA&anno=2009&cod_modello=CCOU&sigla=MO&tipo_cert=C&isEuro=0&quadro=02"
page1 = br.open(url)
html1 = page1.read()
soup1 = BeautifulSoup(html1)
extract(soup1)
outfile.close()

一切都会正常工作,但该页面中某些表格的第一列包含带重音字符的单词。 当我运行代码时,我得到以下信息:

Traceback (most recent call last):
File "modena2.py", line 158, in <module>
  extract(soup1)
File "modena2.py", line 98, in extract
  print >> outfile, "|".join(record)
UnicodeEncodeError: 'ascii' codec can't encode character u'\xe0' in position 32: ordinal not in range(128)

我知道问题出在重音字符的编码上。我试图找到解决方案,但这确实超出了我的知识范围。 我要提前感谢所有愿意帮助我的人。我真的很感激! 很抱歉,如果这个问题太基础了,但是,正如我所说,我刚刚开始使用 python,我正在自学一切。

谢谢! 尼古拉


我将根据反馈再试一次。由于您使用 print 语句来生成输出,因此您的输出必须是字节而不是字符(这是当今操作系统的现实)。默认情况下Python的sys.stdout(打印语句写入的内容)使用“ascii”字符编码。由于 ASCII 只定义了 0 到 127 之间的字节值,因此这些是您可以打印的唯一字节值。因此字节值的错误'\xe0'.

您可以更改字符编码sys.stdout通过执行以下操作将其转换为 UTF-8:

import codecs, sys
sys.stdout = codecs.getwriter('UTF-8')(sys.stdout)
print u'|'.join([u'abc', u'\u0100'])

上面的 print 语句不会抱怨打印无法用 ASCII 编码表示的 Unicode 字符串。但是,下面的代码打印字节而不是字符,会产生 UnicodeDecodeError 异常,因此请注意:

import codecs, sys
sys.stdout = codecs.getwriter('UTF-8')(sys.stdout)
print '|'.join(['abc', '\xe0'])

您可能会发现您的代码正在尝试打印字符,并且将 sys.stdout 的字符编码设置为 UTF-8(或 ISO-8859-1)可以修复它。但您可能会发现代码正在尝试打印字节(从 BeautifulSoup API 获取),在这种情况下,修复可能如下所示:

import codecs, sys
sys.stdout = codecs.getwriter('UTF-8')(sys.stdout)
print '|'.join(['abc', '\xe0']).decode('ISO-8859-1')

我对 BeautifulSoup 包不熟悉,但我建议用各种文档对其进行测试,看看它对字符编码的检测是否正确。您的代码没有明确提供编码,并且它显然自己决定编码。如果该决定来自meta编码标签,那就太好了。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python - 从网站抓取数据时重音字符的问题 的相关文章

随机推荐