2013-10-20 16 views
3

我必須在html源代碼中找到圖像。我使用的是正則表達式而不是html.parser,因爲我知道它更好,但是如果你能向我解釋如何像使用孩子一樣使用html解析,我也很樂意順着這條道路走下去。使用python在html源代碼中查找圖像

不能使用美麗的女孩,希望我能,但我必須學會如何做到這一點。

我已閱讀了很多關於正則表達式和html(example)的問題和解答,所以我意識到了這個話題的感受。

但聽我說!

這裏是我的編碼嘗試(Python 3中):

import urllib.request 
import re 

website = urllib.request.urlopen('http://google.com') 
html = website.read() 
pat = re.compile (r'<img [^>]*src="([^"]+)') 
img = pat.findall(html) 

我雙重檢查我的正則表達式上regex101.com和它的作品在尋找IMG的鏈接,但是當我在怠速運轉時,我得到一個語法錯誤和不斷突出插入。爲什麼?

我走向了正確的方向......是嗎?

更新: 嗨,我想的可能是我簡短的回答,但看起來我可能觸動了社區的神經。

我在編程方面肯定是新的和可怕的,沒有辦法。我一直在閱讀所有評論,我非常感謝用戶向我展示的所有幫助和耐心。

+0

以及在此背景下,這意味着更多的熟悉。我只有被我的老師拋出的HTML解析,沒有工作的例子。有任何線索指向我? – pythonintraining

+0

@ user2799617他是個新手。請儘量多一點文明。從外表看,你對正確的網絡禮儀一無所知。 –

+1

你會得到一個語法錯誤,因爲...這是無效的語法(提示:'re.compile'需要一個字符串)。但是你應該看看BeautifulSoup的html解析器,這裏和其他地方有足夠的例子可以幫助你開始。 – l4mpi

回答

2

沒有什麼錯的正則表達式,你缺少兩樣東西:

  1. Python沒有一個正則表達式類型,所以你必須把它包裝在一個字符串中。使用raw字符串,以便字符串按原樣傳遞給正則表達式編譯器,無需任何轉義解釋
  2. .read()調用的結果是字節序列,而不是字符串。所以你需要一個字節序列正則表達式。

第二個是Python3特定的(而且我知道你正在使用PY 3)

把所有在一起,就解決這樣的上述行:

pat = re.compile (rb'<img [^>]*src="([^"]+)') 

r代表原字節序列爲b

此外,在一個網站上測試,其實際嵌入圖像<img>標籤,如http://stackoverflow.com。處理http://google.com

時,你不會找到任何東西在這裏,我們去:

Python 3.3.2+ 
Type "help", "copyright", "credits" or "license" for more information. 
>>> import urllib.request 
>>> import re 
>>> website = urllib.request.urlopen('http://stackoverflow.com/') 
>>> html = website.read() 
>>> pat = re.compile (rb'<img [^>]*src="([^"]+)') 
>>> img = pat.findall(html) 
>>> img 
[b'http://i.stack.imgur.com/tKsDb.png', b'http://i.stack.imgur.com/dmHl0.png', b'http://i.stack.imgur.com/dmHl0.png', b'http://i.stack.imgur.com/tKsDb.png', b'http://i.stack.imgur.com/6QN0y.png', b'http://i.stack.imgur.com/tKsDb.png', b'http://i.stack.imgur.com/L8rHf.png', b'http://i.stack.imgur.com/tKsDb.png', b'http://pixel.quantserve.com/pixel/p-c1rF4kxgLUzNc.gif'] 
+0

謝謝!我知道我很接近! – pythonintraining

0

re.compile (r'<img [^>]*src="([^"]+)')

你缺少引號(單人或雙人)周圍的圖案

+0

「,並且只是爲了確保在表達式中隱藏引號是很好的」 - 什麼?在這種情況下,這不僅僅是錯誤... – l4mpi

+0

表示同意,但感謝您找到缺少的引號。現在我的錯誤讀取爲: TypeError:不能在類似字節的對象上使用字符串模式 – pythonintraining

+0

這是關於正則表達式的一般說法。在他解析html的情況下,他應該能夠捕獲單引號和雙引號,但這是他的工作 – mislavcimpersak

1

而不是使用urllib,我用requests,你可以從here下載。他們做同樣的事情,我更喜歡requests,因爲它有更好的API。正則表達式字符串只是稍微改變。 \s只是在img標記之前有幾個白色空格的情況下添加的。你分別是朝着正確的方向。你可以找到更多關於re模塊here的信息。

下面是代碼

import requests 
import re 

website = requests.get('http://stackoverflow.com//') 
html = website.text 
pat = re.compile(r'<\s*img [^>]*src="([^"]+)') 
img = pat.findall(html) 

print img 

和輸出:

[u'http://i.stack.imgur.com/tKsDb.png', u'http://i.stack.imgur.com/L8rHf.png', u'http://i.stack.imgur.com/tKsDb.png', u'http://i.stack.imgur.com/Ryr18.png', u'http://i.stack.imgur.com/ASf0H.png', u'http://i.stack.imgur.com/tKsDb.png', u'http://i.stack.imgur.com/tKsDb.png', u'http://i.stack.imgur.com/tKsDb.png', u'http://i.stack.imgur.com/Ryr18.png', u'http://i.stack.imgur.com/VgvXl.png', u'http://i.stack.imgur.com/tKsDb.png', u'http://i.stack.imgur.com/tKsDb.png', u'http://i.stack.imgur.com/tKsDb.png', u'http://i.stack.imgur.com/tKsDb.png', u'http://i.stack.imgur.com/6QN0y.png', u'http://pixel.quantserve.com/pixel/p-c1rF4kxgLUzNc.gif'] 
+0

我會添加一個建議。這個問題在沒有任何代碼檢索網頁的情況下是有效的,將來可能需要創建一個函數來查找你想要的字符串或字節數組,然後該函數只有一個關注點,找到一張圖片列表 –