使用Python中的BeautifulSoup解析格鲁吉亚字符(编码问题)

时间:2015-02-02 20:53:16

标签: python encoding beautifulsoup

我在Python 2.7中使用BeautifulSoup来解析HTML文件中的HTML表格内容。该脚本应该获取一些输入HTML文件(记事本++表示它们是没有BOM的UTF-8)找到文件中的第一个表,并将行和列打印成另一个.html或.txt文件,以某种人类可读的形式(一个一个输入文件的输出文件。)

行和列中的数据是一堆格鲁吉亚字母字符,我猜测编码有问题。

BeautifulSoap说默认输出编码是UTF-8,但在我的情况下似乎不是这样。 Notepad ++显示ANSI,字符无法正确显示。

我的代码如下:

def get_flexion(number_of_files):

    # interates through all input files
    for i in range(1, number_of_files):
        input = open('html/' + str(i) + '.html')

        # parsing html
        soup = BeautifulSoup(input, from_encoding='utf-8')
        table = soup.find('table')
        print table
        if (table == None):
            continue
        else:
            rows = table.find_all('tr')

            # creating output file
            output = open('output/' + str(i) + '.html', 'wb')

            # getting table data
            for tr in rows:
                columns = tr.find_all('td')
                for td in columns:
                    text = td.find(text=True)
                    if text != None:
                        output.writelines(text)
                output.writelines('\n')

正如您所看到的,我在解析的开始处添加一个参数,该参数应该强制使用UTF-8。我尝试了各种其他方式从文档中获取示例,但我的输出文件似乎仍然是ANSI。可能是什么问题?

1 个答案:

答案 0 :(得分:0)

在Python2.x下,内置open函数将使用操作系统的默认字符编码打开一个文件。对于Windows,这是例如大多数西方系统上的Windows-1252,在几个程序中获得misnomer "ANSI"

由于open的默认值,因此无论何时写入文件,都会使用该代码页对内容进行编码。根据您的描述,系统上的代码页不支持格鲁吉亚字符(即使找到的字符都可以映射,这很幸运),这不是您想要的:您希望使用支持格鲁吉亚字符的编码对其进行编码,就像utf-8一样。为此,您可以使用

import codecs
outputfile = codecs.open(path, mode, encoding='utf-8')

并继续照常写入outputfile

请注意,这仅适用于Python2.x。从Python3.3开始,默认的源编码变为utf-8。这是PEP3120的主题。 Python3.3的内置open有一个encoding参数,您可以直接指定("显式优于隐式")。