Unicode,ASCII和正则表达式不起作用

时间:2017-11-24 08:30:29

标签: python unicode encoding utf-8

所以我使用的是Python 3.6.something,我一直试图找出这个完全直观的Unicode / ASCII噩梦。我试图将文本从网页保存到文件中,稍后使用Regex解析它。

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

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

我正在尝试做的RegEx。这真的很奇怪,因为'\ 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)

1 个答案:

答案 0 :(得分:0)

不,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