所以我使用的是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)
答案 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。