你之前的字符串

时间:2014-02-25 03:46:07

标签: python-2.7 unicode beautifulsoup

使用beautifulsoap我从html表中解析了一些值,如下所示:

for string in soup.stripped_strings:
    all_tds.append(string)

当我只是将字符串打印为

for string in soup.stripped_strings:
    print string

我获取了页面中的所有字符串,但当我将其存储在列表中时,如第1段中所示,然后打印列表,我在字符串前面得到一个u(unicode),如下所示

[u'stormvirux (4pa11cs031)', u'Semester:', u'5', u'Result:\xa0\xa0FIRST CLASS', u'Subject', u'External', u'Internal', u'Total', u'Result', u'Software Engineering (10IS51)', u'58', u'24', u'82', u'P', u'Systems Software (10CS52)', u'70', u'24', u'94', u'P', u'Operating Systems (10CS53)', u'58', u'18', u'76', u'P', u'Database Management Systems (10CS54)', u'42', u'25', u'67', u'P', u'Computer Networks - I (10CS55)', u'62', u'23', u'85', u'P', u'Formal Languages & Automata Theory (10CS56)', u'37', u'24', u'61', u'P', u'Database Applications Laboratory (10CSL57)', u'40', u'25', u'65', u'P', u'Systems Software & Operating Systems Lab. (10CSL58)', u'40', u'21', u'61', u'P', u'Total Marks:', u'591']

如果我尝试将string直接写入文件fl.write(string),我会收到错误

UnicodeEncodeError: 'ascii' codec can't encode characters in position 7-8: ordinal not in range(128)

为什么会发生这种情况以及可以做些什么?

3 个答案:

答案 0 :(得分:2)

使用codecs.open()io.open()使用适当的文本编码(即encoding="...")打开文本文件,而不是使用open()打开字节文件。

答案 1 :(得分:1)

您会看到列表中包含的Unicode字符串的表示形式。打印列表时,会在其中的每个项目上调用repr()

>>> s = u'text…'
>>> s
u'text\u2026'
>>> print(s)
text…
>>> print([s]) # <-- a list with a single item (the string)
[u'text\u2026']

u''是Unicode文字的语法,可用于在Python源代码中定义Unicode字符串。注意:如果在字符串文字中使用非ascii字符,则应在模块顶部定义源代码编码,例如# -*- coding: utf-8 -*-

要在写入文件时修复UnicodeEncodeError,您需要将Unicode字符串转换为字节。 BeautifulSoup provides several html-specific ways要做到这一点。

注意:一般情况下,通用codecs.open()io.open() suggested by @Ignacio Vazquez-Abrams不适合html文字,例如,他们不会修改{{1} } tag。

答案 2 :(得分:0)

尝试将它们转换为字符串:

for string in soup.stripped_strings:
    all_tds.append(str(string))

这是列表理解:

all_tds = [str(string) for string in soup.stripped_strings]