2017-11-24 26 views
-3

私はPython 3.6.somethingを使用しており、この完全に直感的なUnicode/ASCIIの悪夢を理解しようとしています。私は、Webページからファイルにテキストを保存しようとしており、後でRegexを使用して解析します。Unicode、ASCII、Regexは動作しません

私はファイルを読み込み、それを解析しようとすると、私はパターンを見つける必要がある:

Note 1 – 

とは明らかに異なっている:

Note 1 - 

私はエラーを取得しておいてください。

私がしようとしているRegExの
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) 
+2

例外メッセージは**非常にクリアです**。 URLに従って、コードにソースコードエンコーディング宣言を追加しましたか? –

+1

'\ x96'はASCII文字ではありません**。 ASCIIは0x00から0x7Fまで実行されます。 –

+0

"URL"はエラーメッセージの1つです。 http://python.org/dev/peps/pep-0263/ – tripleee

答えて

0

いいえ、0x96はないASCII codepointです。 ASCII規格では、7ビットコードポイントのみが定義されているため、0x00から0x7Fまでです。 0x96は有効なUTF-8 byte sequenceでもありません。

あなたが最も可能性の高い0x96が U+2013 EN DASHコードポイントである Windows Codepage 1252、としてあなたのソースコードを保存した

(1250年と1258年の間のすべてのコードページがそうではなく、1252年で最も広く使用されています)。したがって、例外メッセージの後に、エラーの原因を取り除くことができます。

# encoding: cp1252 

ファイルの先頭に追加してください。または、ファイルをUTF-8として保存するようにエディタを構成することもできます(バイトコード0xE2 0x80 0x93がそのコードポイントを表すために書き込まれます)。また

、文字通りあなたの文字列に\uhhhhエスケープシーケンスを使用して、ソースコード内のASCII文字のみを使用します。

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

あなたは、UnicodeとPythonの上に読むことをお勧めします、私は強くネッドBatchelderのPragmatic Unicodeをお勧めします。

+0

あなたの助けてくれてありがとう、私はすでにNed Batchelderの材料を使っていますが、ゆっくりとしています。私はソースコードを推測したことはありませんでしたが、それは完全に機能しました。 – Stoltec

関連する問題