15

我正在尝试从字符串中清除所有 HTML,因此最终输出是一个文本文件。我对各种“转换器”进行了一些研究,并开始倾向于为实体和符号创建自己的字典并在字符串上运行替换。我正在考虑这一点,因为我想自动化这个过程,并且底层 html 的质量存在很多可变性。为了开始比较我的解决方案和替代方案之一的速度,例如 pyparsing,我决定使用字符串方法 replace 测试 \xa0 的替换。我得到一个

UnicodeDecodeError: 'ascii' codec can't decode byte 0xa0 in position 0: ordinal not in range(128)

实际的代码行是

s=unicodestring.replace('\xa0','')

无论如何 - 我决定我需要在它前面加上一个 r 所以我运行了这行代码:

s=unicodestring.replace(r'\xa0','')

它运行没有错误,但是当我查看 s 的一部分时,我看到 \xaO 仍然存在

4

6 回答 6

25

也许你应该做

s=unicodestring.replace(u'\xa0',u'')
于 2009-04-15T18:22:48.240 回答
6
s=unicodestring.replace('\xa0','')

..正在尝试创建 unicode 字符\xa0,该字符在 ASCII 字符串中无效(Python 3.x 之前的默认字符串类型)

r'\xa0'没有出错的原因是因为在原始字符串中,转义序列无效。它没有尝试将字符串编码\xa0为 un​​icode 字符,而是将字符串视为“文字反斜杠”、“文字 x”等。

以下是相同的:

>>> r'\xa0'
'\\xa0'
>>> '\\xa0'
'\\xa0'

这是 Python v3 中解决的问题,因为默认字符串类型是 unicode,所以你可以这样做。

>>> '\xa0'
'\xa0'

我正在尝试从字符串中清除所有 HTML,因此最终输出是一个文本文件

为此,我强烈推荐BeautifulSoup。编写一个 HTML 清理工具很困难(考虑到大多数 HTML 是多么可怕),而 BeautifulSoup 在解析 HTML 和处理 Unicode 方面做得很好。

>>> from BeautifulSoup import BeautifulSoup
>>> soup = BeautifulSoup("<html><body><h1>Hi</h1></body></html>")
>>> print soup.prettify()
<html>
 <body>
  <h1>
   Hi
  </h1>
 </body>
</html>
于 2009-04-15T20:33:03.137 回答
3

查看codecs标准库,特别是 Codec 基类中提供的encodedecode方法。

这里还有一篇很好的文章将所有内容放在一起。

于 2009-04-15T18:17:29.280 回答
2

而不是这个,最好使用标准的python特性。

例如:

string = unicode('Hello, \xa0World', 'utf-8', 'replace')

或者

string = unicode('Hello, \xa0World', 'utf-8', 'ignore')

where replace will replace \xa0 to \\xa0.

But if \xa0 is really not meaningful for you and you want to remove it then use ignore.

于 2012-09-13T13:19:28.447 回答
1

只是关于 HTML 清理的说明。这是非常非常困难的,因为

<
body
>

是编写 HTML 的有效方式。仅供参考。

于 2009-04-15T18:18:02.027 回答
0

您可以通过以下方式将其转换为 unicode:

print u'Hello, \xa0World'  # print Hello,  World
于 2009-04-15T18:18:07.657 回答