2011-08-30 153 views
1

python原始字符串和字符串文字如何工作?我試圖讓一個webscraper從一個網站下載pdf。當我搜索它工作的字符串,但是當我嘗試實施它在python我總是沒有我的答案Python原始字符串和html解析

import urllib 
import re  
url="" //insert url here 
sock=urllib.urlopen(url) 
htmlSource=sock.read(); 
sock.close(); 

m=re.match(r"<a href.*?pdf[^>]*?", raw(htmlSource)) 
print m 



$ python temp.py 
None 

的原始功能就是從這裏開始:http://code.activestate.com/recipes/65211-convert-a-string-into-a-raw-string/

這麼說,我怎麼能完成這個程序,以便我可以打印出所有的比賽,然後下載PDF文件?

謝謝!

+7

你使用正則表達式而不是[真正的HTML解析器](http://www.crummy.com/software/BeautifulSoup/)的任何原因? –

+0

這部分的內容也只是我在正則表達式中的一個練習 – randomafk

+0

這個問題並不是真的關於「Python原始文字」,是嗎? – Johnsyweb

回答

4

你似乎很困惑。

「字符串文字」是您鍵入到程序中的字符串。因爲你的字符串需要有一個清晰的開始和結束,所以某些字符在字符串中間變得不方便,並且必須使用轉義序列來表示它們。

Python提供了'原始'字符串文字,它們對於轉義序列的解釋有着不同的規則:相同的規則用於確定字符串結尾的位置(所以一個反斜槓,後面跟着開頭引號字符, t終止字符串),但是然後反斜槓之間的東西不會被轉換。因此,雖然'\''是一個由單引號字符組成的字符串(中間的\'是生成引號的轉義序列),但r'\''是一個由反斜槓和引號字符組成的字符串。

原始字符串文字生成str類型的對象。它與普通的字符串文字相同。這些通常用於模式的正則表達式操作,因爲用於正則表達式的字符串通常需要包含大量反斜槓。如果你想編寫一個匹配源文本中反斜槓的正則表達式,並且你沒有原始字符串文字,那麼你需要在源代碼中引用四個反斜槓:Python編譯器會將其解釋爲包含兩個真正反斜槓的字符串,這反過來在正則表達式語法中表示「匹配反斜槓」。

您發現的功能是將轉義序列重新引入輸入文本的不完美嘗試。 這不是你想做什麼,甚至沒有意義,也不符合作者自己的規範。這似乎是基於類似於你自己的一種誤解。 「原始等價」字符串的概念是無意義的。真的,沒有這樣的東西,「原始字符串」;原始字符串文字是創建普通字符串的一種方便。

您想搜索htmlSource中的模式。它已經在你需要它的形式在。您的問題有與字符串轉義無關當字符串來自用戶輸入,文件輸入或基本上除程序源以外的任何其他字符串時,它不會像字符串文字一樣處理,除非您明確地安排這種情況發生。如果網頁中包含反斜槓,後跟n,則在urllib處讀取的字符串在相應位置中包含 - 反斜槓,後跟n,而不是換行符。

問題如下:你想要搜索這個字符串,就像你說的:「當我搜索它的字符串的時候」。您目前是匹配的字符串。請參閱文檔:

Help on function match in module re: 

match(pattern, string, flags=0) 
    Try to apply the pattern at the start of the string, returning 
    a match object, or None if no match was found. 

你的模式不會出現在字符串的開頭,因爲該網頁的HTML不與<a>標籤您正在尋找的開始。您需要m=re.search(r"<a href.*?pdf[^>]*?", htmlSource)

1

結帳this answer。看起來Python的urllib比用戶更友好 - 而且對Unicode友好。它似乎迫使你處理難看的原始字節內容,而不是將它解碼爲一個普通的字符串。

+0

OP的問題似乎並不涉及unicode,雖然這肯定會導致進一步的問題。至少在2.x中,Python很樂意將「難看的原始字節內容」視爲一個字符串。這並不像嘗試用正則表達式解析HTML那麼糟糕;)OP對「原始字符串」的明顯混淆是IMO的一個更爲重要的問題。 ('r'''不是'u'''的反義詞) –

+0

@tchrist我以爲你說過「獨角獸友好」,並且很興奮:/ – Coldblackice