【问题标题】:Unicode, ASCII, and Regex Won't WorkUnicode、ASCII 和正则表达式不起作用
【发布时间】:2018-05-08 05:28:53
【问题描述】:

所以我正在使用 Python 3.6.something 并且我一直在尝试找出这个完全直观的 Unicode/ASCII 噩梦。我正在尝试将网页中的文本保存到文件中,然后使用正则表达式对其进行解析。

当我尝试读取文件并解析它时,我需要找到模式:

Note 1 –

这显然不同于:

Note 1 -

我不断收到错误:

SyntaxError: Non-UTF-8 code starting with '\x96' in file C:\Users\Steve\eclipse-workspace\scraper\BeautifulSoupTest.py on line 28, but no encoding declared; see http://python.org/dev/peps/pep-0263/ for details

关于我正在尝试做的正则表达式。这真的很奇怪,因为 '\x96' 是我在网上看到的 Unicode 字符。 Unicode 或 ASCII 发生了一些事情,我不知道它是什么。我也不能用 replace() 删除 '\x96' 字符,它给出了同样的错误。有人可以帮忙吗?

from bs4 import BeautifulSoup
from urllib.request import urlopen
import re

def downloadCleanText(url, year):
    urlObject = urlopen(url)

    rawHTML = urlObject.read()


    cleanedText = BeautifulSoup(rawHTML, 'html.parser').body.getText()

    outputFile = open(str(year) + '.txt', 'w')

    outputFile.write(cleanedText)

    outputFile.close()

def pullNote1(year):
    inputFile = open(str(year) + '.txt', 'r')

    inData = inputFile.read()

    outData = re.findall('Note 1 –(.*?)Note 2 ', inData)

    print(outData)

    inputFile.close()

downloadCleanText('https://www.sec.gov/Archives/edgar/data/320193/000032019317000070/a10-k20179302017.htm#s2A826F0B8B5755F787D29B5B8C8C7D16', 2000)
pullNote1(2000)

【问题讨论】:

  • 异常信息非常清楚。您是否按照 URL 并将源代码编码声明添加到您的代码中?
  • \x96 不是 ASCII 字符。 ASCII 从 0x00 到 0x7F。
  • “URL”是错误消息中的那个; python.org/dev/peps/pep-0263
  • 您的正则表达式中有一个U+2013 EN DASH 字符,并将您的文件编码为Windows Codepage 1252,其中EN DASH 编码为0x96。您还使用了 字节字符串,而不是 Unicode 字符串。除非您的输入数据实际上也被编码为 CP1252,否则您的正则表达式将不匹配。

标签: python unicode encoding utf-8


【解决方案1】:

不,0x96 不是ASCII codepoint。 ASCII 标准仅定义 7 位代码点,因此从 0x00 到 0x7F。 0x96 也不是有效的UTF-8 byte sequence

您很可能已将源代码保存为 Windows Codepage 1252,其中 0x96 是 U+2013 EN DASH 代码点(1250 和 1258 之间的所有代码页都可以,但 1252 是最广泛使用的)。因此,在异常消息之后,您可以通过添加以下内容来消除错误:

# encoding: cp1252

在文件的顶部。或者您可以配置您的编辑器以将文件另存为 UTF-8(此时将写入字节序列 0xE2 0x80 0x93 以表示该代码点)。

或者,通过在字符串文字中使用 \uhhhh 转义序列,在源代码中仅使用 ASCII 字符:

outData = re.findall('Note 1 \u2013(.*?)Note 2 ', inData)

您可能想了解 Unicode 和 Python,我强烈推荐 Ned Batchelder 的 Pragmatic Unicode

【讨论】:

  • 感谢您的帮助,我已经浏览了 Ned Batchelder 的材料,尽管速度很慢。不过,我永远不会猜到源编码,而且效果很好。
猜你喜欢
  • 2013-09-08
  • 2023-03-23
  • 2018-09-08
  • 1970-01-01
  • 1970-01-01
  • 2010-09-06
  • 1970-01-01
  • 2020-04-02
  • 2012-05-15
相关资源
最近更新 更多