使用 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 从网站中提取和下载所有图像?

如何使用 BeautifulSoup 从内联样式中提取 CSS 属性

使用BeautifulSoup检索图像链接

Beautifulsoup4错误选择多个属性

beautifulsoup 对象如何能够将标签作为属性?

使用 BeautifulSoup 获取属性值