2016-04-26 72 views
1

我有類似下面的變量:蟒蛇正則表達式查找圖片路徑

var = '<img src="path_1"><p>Words</p><img src="path_2>' 

它是一個字符串,但裏面顯然是HTML元素。我如何才能使用正則表達式獲得第一條路徑(即path_1)?

我想是這樣的:

match = re.match(r'src=\"[\w-]+\"', var) 
print match.group(0) 

我得到這個錯誤:

Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
AttributeError: 'NoneType' object has no attribute 'group' 

任何幫助表示讚賞。

+3

嘗試're.search()' – thebjorn

+0

'match'只能從開頭找到.. ['如果字符串開頭的零個或多個字符匹配正則表達式模式](https://docs.python.org /2/library/re.html#re.match) – rock321987

回答

4

should use an HTML parserBeautifulSoup

>>> from bs4 import BeautifulSoup 
>>> var = '<img src="path_1"><p>Words</p><img src="path_2>' 
>>> soup = BeautifulSoup(var, "html.parser") 
>>> soup.img["src"] 
'path_1' 

至於正則表達式的方法,你需要做以下修改,使其工作:

  • 開關re.search()re.match()開始從匹配字符串開頭
  • 加一個capturing group來捕獲src
  • 就沒有必要逃避雙引號

修正版本:

>>> re.search(r'src="([\w-]+)"', var).group(1) 
'path_1' 
+2

我會說:你***應該***使用一個HTML解析器 –

+1

@PedroLobito絕對,做了修改並引用了着名的線程。謝謝。 – alecxe

+1

哇,我其實不知道這個存在。這看起來非常合適。非常感謝! –

2

正如評論所說,使用search()因爲match()將嘗試正則表達式從一開始匹配字符串。您也可以使用捕捉命名組,使代碼更易讀:

var = '<img src="path_1"><p>Words</p><img src="path_2>' 
import re 
match = re.search(r'src=\"(?P<path1>[\w-]+)\"', var) 
if match: 
    print(match.group('path1')) 

輸出:

path_1 
1

嘗試,

path1= re.search(r'<img\s+src="(.*?)"><p>',var).group(1) # path_1 
  1. BeutifulSoup方便。但非常慢

  2. HTMLParser要快得多。但使用它是痛苦的。

  3. re最快選項,在我看來,對於無國籍 usecases這是值得的。

如果目標文字狀態,即大量的嵌套並捕獲語義是很重要的,而不是實現狀態機e.g解析器使用一個可用的解析器。我強烈建議lxml解析HTML和XML。這比bs4方便一點,但在速度上相當於re

+0

聲明「BeautifulSoup」「很慢」的說法太過強烈。您可以將其配置爲使用不同的分析器:說'lxml':'BeautifulSoup(data,「lxml」)'。或者你可以通過'SoupStrainer'等解析文檔的一部分。 – alecxe

+0

我知道它。即使你在引擎蓋下使用'lxml',它比're'慢了一個數量級。所有的對象創作和外觀.. –