使用 BeautifulSoup 基于属性提取图像 src
Posted
技术标签:
【中文标题】使用 BeautifulSoup 基于属性提取图像 src【英文标题】:Extracting image src based on attribute with BeautifulSoup 【发布时间】:2013-08-20 16:52:01 【问题描述】:我正在使用 BeautifulSoup 从 IMDb 获取 html 页面,我想从页面中提取海报图像。我已经获得了基于其中一个属性的图像,但我不知道如何提取其中的数据。
这是我的代码:
url = 'http://www.imdb.com/title/tt%s/' % (id)
soup = BeautifulSoup(urllib2.urlopen(url).read())
print("before FOR")
for src in soup.find(itemprop="image"):
print("inside FOR")
print(link.get('src'))
【问题讨论】:
【参考方案1】:你快到了 - 只是几个错误。 soup.find()
获取匹配的第一个元素,而不是列表,因此您无需遍历它。获得元素后,您可以使用字典访问来获取其属性(如src
)。这是一个重新设计的版本:
film_id = '0423409'
url = 'http://www.imdb.com/title/tt%s/' % (film_id)
soup = BeautifulSoup(urllib2.urlopen(url).read())
link = soup.find(itemprop="image")
print(link["src"])
# output:
http://ia.media-imdb.com/images/M/MV5BMTg2ODMwNTY3NV5BMl5BanBnXkFtZTcwMzczNjEzMQ@@._V1_SY317_CR0,0,214,317_.jpg
我已将id
更改为film_id
,因为id()
是一个内置函数,屏蔽它们是不好的做法。
【讨论】:
【参考方案2】:我相信你的例子非常接近。您需要使用 findAll() 而不是 find() 并且当您迭代时,您从 src 切换到链接。在下面的示例中,我将其切换为 tag
此代码适用于 BeautifulSoup4:
url = 'http://www.imdb.com/title/tt%s/' % (id,)
soup = BeautifulSoup(urllib2.urlopen(url).read())
print "before FOR"
for tag in soup.findAll(itemprop="image"):
print "inside FOR"
print(tag['src'])
【讨论】:
【参考方案3】:如果我理解正确,您正在寻找图像的 src,然后提取它。
首先,您需要(使用检查器)找到图像在 HTML 中的哪个位置。例如,在我正在报废足球队盾牌的粒子案例中,我需要:
m_url = 'http://www.marca.com/futbol/primera/equipos.html'
client = uOpen(m_url)
page = client.read()
client.close()
page_soup = BS(page, 'html.parser')
teams = page_soup.findAll('li', 'id': 'nombreEquipo')
for team in teams:
name = team.h2.text
shield_url = team.img['src']
然后,您需要处理图像。你必须选择。
第一个:使用 numpy:
def url_to_image(url):
'''
Función para extraer una imagen de una URL
'''
resp = uOpen(url)
image = np.asarray(bytearray(resp.read()), dtype='uint8')
image = cv2.imdecode(image, cv2.IMREAD_COLOR)
return image
屏蔽 = url_to_image(shield_url)
第二次使用 scikit-image 库(您可能需要安装):
shield = io.imread('http:' + shield_url)
注意:在这个特殊的例子中,我需要在开头添加 http:。
希望对你有帮助!
【讨论】:
【参考方案4】:这是一个完整的工作示例,gazpacho:
第 1 步 - 导入所有内容并下载 html:
from pathlib import Path
from urllib.request import urlretrieve as download
from gazpacho import Soup
id = 'tt5057054'
url = f"https://www.imdb.com/title/id"
soup = Soup.get(url)
第 2 步 - 找到图片资源的 src url:
image = (soup
.find("div", "id": "title-overview")
.find("div", "class": "poster")
.find("img")
.attrs['src']
)
第 3 步 - 将其保存到您的机器上:
directory = "images"
Path(directory).mkdir(exist_ok=True)
extension = image.split('.')[-1]
download(image, f"directory/id.extension")
【讨论】:
以上是关于使用 BeautifulSoup 基于属性提取图像 src的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 beautifulSoup 从网站中提取和下载所有图像?