2013-12-11 63 views
0

我有一個很大的html塊,我想刪除所有<img>元素,但不是它們的文本部分。因此,也許有這樣的事情:使用正則表達式刪除選定的文本

<a href="http:">Some text</a> Some other text <img height="1" picture.gif> MORE TEXT </img> 

如果我使用BeautifulSoup提取所有的img標籤,我也失去了相關的文本(在上面的例子中「更多的文本」)。因此,我決定在製作湯之前在整個html上使用正則表達式。我想通過下一個">"刪除每個"<img",然後還要每隔"</img>"。這應該留下背後的文字。

因此,這裏是我的嘗試:

while myhtml.find('<img/') > 0: 
    re.sub(r'<img .*?>', '', myhtml , flags=re.DOTALL) 
    re.sub(r'</img>', '', myhtml , flags=re.DOTALL) 

我跑了這一點,所有的IMG部分仍然存在。不知道接下來要嘗試什麼。

回答

1

我有一個很大的html塊,我想刪除所有<img>元素,但不是它們的文本部分。

你能避免使用此正則表達式。

>>> from BeautifulSoup import BeautifulSoup                                
>>> html = '<a href="http:">Some text</a> Some other text <img height="1" picture.gif> MORE TEXT </img>' 
>>> soup = BeautifulSoup(html) 
>>> for m in soup.findAll('img'): 
>>>  m.replaceWithChildren() 

>>> print soup 

<a href="http:">Some text</a> Some other text MORE TEXT 

如果你還是喜歡使用正則表達式,只是想刪除所有<img ..></img>標籤:

re.sub(r'</?img[^>]*>', '', html) 
1

你可以使用以下正則表達式來匹配<img>元素:

(?<!(<[^>]*))(</?img[^>]*>) 

正則表達式的第一部分(?<!(<[^>]*))聲明負面的後視圖,即<img>元素不在另一個打開的標記元素內。這應該解釋諸如標籤出現在字符串中的情況。

正則表達式的第二部分(</?img[^>]*>)<img...></img>標籤元素匹配。