2013-04-26 100 views
0

我有一個Python腳本,使用美麗的湯從目錄中的HTML文件中提取文本。但是,我無法使編碼正常工作。起初,我認爲HTML文件本身可能存在問題。然而,當我查看Notepad.exe的一個HTML文件的來源,我比如看到這一點:Vi er her for deg, og du må gjerne ta kontakt med oss på 815 32 000 eller på Facebook om du har noen spørsmål.使用美麗的湯從HTML文件中提取挪威文,丟失挪威字符

然而,當我在Internet Explorer查看相同的HTML文件,我看到:Vi er her for deg, og du mÃ¥ gjerne ta kontakt med oss pÃ¥ 815 32 000 eller pÃ¥ Facebook om du har noen spørsmÃ¥l.

而且,Internet Explorer文本與我的Python腳本附加到我的文本文件中的文本相同。所以,顯然編碼是可檢測的,IE不理解它,但我似乎無法弄清楚爲什麼Python無法處理它。編碼應該是拉丁-1,我認爲這不會是一個問題。下面的代碼我有:

import os 
import glob 
from bs4 import BeautifulSoup 

path = "c:\\users\\me\\downloads\\" 

for infile in glob.glob(os.path.join(path, "*.html")): 
    markup = (infile) 
    soup = BeautifulSoup(open(markup, "r").read()) 
    with open("example.txt", "a") as myfile: 
     myfile.write(soup.get_text()) 
     myfile.close() 

存在作爲,似乎打破了編碼,我想我可以通過Latin-1編碼,就像這樣:

soup = BeautifulSoup(open(markup, "r").read()) 
soup = soup.prettify("latin-1") 

但是,這給我的錯誤:

Traceback (most recent call last): 
    File "bsoup.py", line 12, in <module> 
    myfile.write(soup.get_text()) 
AttributeError: 'bytes' object has no attribute 'get_text' 

回答

3

.prettify()已經返回字節,所以你只要編寫直接到該文件,但你必須打開該文件在二進制模式(注ŧ下面使用他'ab'模式):

soup = BeautifulSoup(open(markup, "r").read()) 
with open("example.txt", "ab") as myfile: 
    myfile.write(soup.prettify('latin-1')) 

無需調用myfile.close(); with聲明已經考慮到了這一點。

只保存文本,打開文本模式('a')的文件,並指定要使用的編碼上節省:

soup = BeautifulSoup(open(markup, "r").read()) 
with open("example.txt", "a", encoding='latin-1') as myfile: 
    myfile.write(soup.get_text()) 

現在,Python會自動編碼Unicode文本到Latin-1的爲您服務。

當你看到這樣Ã¥代替å,那麼你解釋UTF-8字節的Latin-1。

您可能需要Python和Unicode的讀了起來:由Joel Spolsky的

+0

啊,有了這個選項,雖然,HTML被保存在輸出文件中。我認爲調用get_text()是獲取文本的方法? – 2013-04-26 21:51:34

+0

@ZacBrown:已更新。 – 2013-04-26 21:58:23

+0

謝謝@Martijn。我不確定什麼是錯誤的,但我改變了我的代碼,就像你的第二個例子,我的example.txt文件仍然顯示不正確的字符。如果有幫助,我使用美國個人電腦在Windows 7上。 – 2013-04-26 22:07:44