使用Python从HTML页面中提取图像

Nov*_*mer 3 python image extract python-3.x

以下是我的代码.它试图在html中的图像标记内获取图像的src.

import re
for text in open('site.html'):
  matches = re.findall(r'\ssrc="([^"]+)"', text)
  matches = ' '.join(matches)
print(matches)
Run Code Online (Sandbox Code Playgroud)

问题是当我输入类似的东西:

<img src="asdfasdf">
Run Code Online (Sandbox Code Playgroud)

它可以工作但是当我放入一个完整的HTML页面时,它什么都不返回.为什么这样做?我该如何解决?

Site.html只是标准格式的网站的HTML代码.我希望它忽略一切,只打印图像的源代码.如果您想查看site.html内部的内容,请转到基本的HTML网页并复制所有源代码.

Ter*_*ryA 6

当您可以使用BeautifulSoup之类的东西轻松地执行此操作时,为什么要使用正则表达式来解析HTML :

>>> from bs4 import BeautifulSoup as BS
>>> html = """This is some text
... <img src="asdasdasd">
... <i> More HTML <b> foo </b> bar </i>
... """
>>> soup = BS(html)
>>> for imgtag in soup.find_all('img'):
...     print(imgtag['src'])
... 
asdasdasd
Run Code Online (Sandbox Code Playgroud)

您的代码无法工作的原因是因为text该文件的一行.因此,您只在每次迭代中找到一条线的匹配项.虽然这可能有效,但请考虑最后一行是否没有图像标记.matches将是一个空列表,并将join成为''.您将matches每行覆盖变量.

你想调用findall整个HTML:

import re
with open('site.html') as html:
    content = html.read()
    matches = re.findall(r'\ssrc="([^"]+)"', content)
    matches = ' '.join(matches)

print(matches)
Run Code Online (Sandbox Code Playgroud)

with在这里使用一个声明更加pythonic.这也意味着你不必在file.close()事后打电话,因为with声明处理了这个问题.