我有一个大的html块,我想删除所有<img>
个元素,但不是它们的文本部分。所以也许有这样的事情:
<a href="http:">Some text</a> Some other text <img height="1" picture.gif> MORE TEXT </img>
如果我使用BeautifulSoup来提取所有img标签,我也会丢失相关文本(上例中的“MORE TEXT”)。所以我决定在制作汤之前在整个html上使用正则表达式。我想通过下一个"<img"
删除每个">"
,然后每隔"</img>"
删除一次while myhtml.find('<img/') > 0:
re.sub( r'<img .*?>', '', myhtml , flags=re.DOTALL)
re.sub( r'</img>', '', myhtml , flags=re.DOTALL)
。这应该留下文字。
所以这是我的尝试:
{{1}}
我跑了这个,所有的img部分仍在那里。不知道下一步该尝试什么。
答案 0 :(得分: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 :(得分:1)
您可以使用以下正则表达式匹配<img>
元素:
(?<!(<[^>]*))(</?img[^>]*>)
正则表达式的第一部分(?<!(<[^>]*))
断言负{@ 1}}元素不在另一个开放标记元素中。这应该考虑诸如标签出现在字符串中的情况。
正则表达式的第二部分<img>
与(</?img[^>]*>)
和<img...>
标记元素匹配。