我在Python 2.7中使用BeautifulSoup来解析HTML文件中的HTML表格内容。脚本应该抓取一些输入HTML文件(记事本++说它们是UTF-8 w/o BOM),找到文件中的第一个表,并以某种人类可读的形式将行和列打印到另一个.html或.txt文件中(一个输出文件对应一个输入文件)。
行和列中的数据是一堆格鲁吉亚字母字符,我猜编码有问题。
BeautifulSoap说默认输出编码是UTF-8,但在我的情况下似乎并非如此。记事本++显示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。可能是什么问题?
在 Python2.x 下,内置的 open
函数将打开一个带有操作系统默认字符编码的文件。对于Windows,例如 大多数西方系统上的Windows-1252,在几个程序中都得到了误称"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
参数,可以直接指定("显式优于隐式")。