2009-04-15 42 views
15

我試圖清理所有的HTML的一個字符串,這樣最終輸出是一個文本文件。我對各種「轉換器」進行了一些研究,並開始傾向於爲實體和符號創建我自己的字典並對字符串進行替換。我正在考慮這個,因爲我想讓這個過程自動化,並且底層html的質量有很大的變化。要開始比較我的解決方案的速度,例如pyparsing我決定測試使用字符串替換方法\ XA0的替代方案之一。我得到一個如何使用Unicode工作在Python

UnicodeDecodeError: 'ascii' codec can't decode byte 0xa0 in position 0: ordinal not in range(128) 

的實際代碼行是

s=unicodestring.replace('\xa0','') 

反正,我決定,我需要與R鍵前言,所以我跑了這行代碼:

s=unicodestring.replace(r'\xa0','') 

它運行沒有錯誤,但我當我看着一片s我看到\ xaO仍然存在

+3

爲什麼要在'\ xa0'前加一個r?這使它成爲一個原始字符串 - 也就是說,它實際上包含反斜槓,x,a,0.如果沒有r,它包含一個帶有十六進制代碼a0的單個字符,我認爲它就是你想要的。 – 2009-04-15 18:26:42

+0

因爲我試圖猜測爲什麼我得到錯誤,並且我知道有時要強制讀取\,您必須將其設置爲字符串文本,並且\ xa0實際上存在於我的源文件中。什麼是十六進制代碼a0? – PyNEwbie 2009-04-15 18:44:23

回答

25

可能是你應該做的

s=unicodestring.replace(u'\xa0',u'') 
+0

那麼你怎麼知道這樣做,因爲我沒有看到這個例子?謝謝 – PyNEwbie 2009-04-15 18:30:11

3

看看codecs標準庫,特別是編碼解碼在編解碼器的基類提供方法。

還有一個很好的文章here把它放在一起。

+0

感謝偉大的文章,你是對的,它確實把很多東西放在一起。 – PyNEwbie 2009-04-15 18:32:46

1

關於HTML清潔剛一說明。這是非常非常困難的,因爲

< 
body 
> 

是寫HTML的有效方法。只是一個fyi。

0

您可以將它以這種方式爲Unicode:

print u'Hello, \xa0World' # print Hello, World 
6
s=unicodestring.replace('\xa0','') 

..是試圖創建Unicode字符\xa0,這是無法在ASCII字符串中使用(Python中的默認字符串類型,直到版本3.x)

T他有理由r'\xa0'沒有誤差是因爲在原始字符串,轉義序列沒有任何效果。而不是試圖編碼\xa0成Unicode字符,它看到字符串作爲「反斜線」,「文字X」等..

以下是一樣的:

>>> r'\xa0' 
'\\xa0' 
>>> '\\xa0' 
'\\xa0' 

這是一些在Python V3解決,因爲默認的字符串類型是unicode的,所以你可以做..

>>> '\xa0' 
'\xa0' 

我試圖清理所有的HTML的一個字符串,這樣最終輸出是一個文本文件

我會強烈建議BeautifulSoup這一點。編寫一個HTML清潔工具是困難的(考慮到大多數HTML是多麼的可怕),和BeautifulSoup做了偉大的工作,在兩個解析HTML,以及處理Unicode的..

>>> from BeautifulSoup import BeautifulSoup 
>>> soup = BeautifulSoup("<html><body><h1>Hi</h1></body></html>") 
>>> print soup.prettify() 
<html> 
<body> 
    <h1> 
    Hi 
    </h1> 
</body> 
</html> 
2

取而代之的是,最好使用標準的Python特徵。

例如:

string = unicode('Hello, \xa0World', 'utf-8', 'replace') 

string = unicode('Hello, \xa0World', 'utf-8', 'ignore') 

其中replace將取代\xa0\\xa0

但是,如果\xa0對您來說確實沒有意義,而您想將其刪除,請使用ignore