【问题标题】:How to work with unicode in Python如何在 Python 中使用 unicode
【发布时间】:2010-10-19 16:11:38
【问题描述】:

我正在尝试从字符串中清除所有 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 仍然存在

【问题讨论】:

  • 为什么要在 '\xa0' 前面加上一个 r?这使它成为一个原始字符串 - 也就是说,它实际上包含反斜杠、x、a、0。没有 r,它包含一个带有十六进制代码 a0 的单个字符,我认为这就是你想要的。
  • 因为我试图猜测为什么会出现错误,而且我知道有时要强制读取 \,您必须将其设为字符串文字,并且 \xa0 是我的实际存在的资源。什么是十六进制代码 a0?

标签: python string unicode replace unicode-string


【解决方案1】:

也许你应该这样做

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

【讨论】:

  • 那么你是怎么知道这样做的,因为我在任何例子中都没有看到这个?谢谢
【解决方案2】:
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>

【讨论】:

  • 我很欣赏这个答案。我使用 BS 从表中提取数据,它非常有用。但是,在我看来,要使用 BS 删除 html,我必须知道存在什么。我错了吗?
  • 我不确定你的意思?您可以通过无数种方式删除 HTML,从 div 中的第一个表到按类或 id 等。
  • BeautifulSoup.prettyify() 只是一个救生员!谢谢!
【解决方案3】:

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

还有一篇很好的文章here 把它们放在一起。

【讨论】:

  • 感谢伟大的文章,你是对的,它确实把很多东西放在一起。
【解决方案4】:

除此之外,最好使用标准的 Python 功能。

例如:

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

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

其中replace 将替换\xa0\\xa0

但如果\xa0 对您来说真的没有意义并且您想删除它,那么请使用ignore

【讨论】:

    【解决方案5】:

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

    <
    body
    >
    

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

    【讨论】:

      【解决方案6】:

      你可以这样转成unicode:

      print u'Hello, \xa0World'  # print Hello,  World
      

      【讨论】:

        猜你喜欢
        • 2012-06-25
        • 2021-07-19
        • 2020-03-30
        • 1970-01-01
        • 2014-03-05
        • 1970-01-01
        • 1970-01-01
        • 2017-08-25
        • 1970-01-01
        相关资源
        最近更新 更多