使用BeautifulSoup根据属性提取图片src

9
我正在使用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'))
4个回答

12
你已经接近成功 - 只有几个错误。 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()是一个内置函数,掩盖这些函数是不好的做法。


5

我认为你的例子非常接近。你需要使用findAll()而不是find(),当你迭代时,你需要从src切换到link。在下面的例子中,我将其切换为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'])

2

如果我理解正确,您正在寻找图像的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

shield = url_to_image(shield_url)

使用scikit-image库(您可能需要安装):

shield = io.imread('http:' + shield_url)

注意:在这个特定的例子中,我需要在开头添加http:。

希望能帮到你!


0

这是一个完整的工作示例,使用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']
)

步骤三 - 将其保存到您的计算机:

directory = "images"
Path(directory).mkdir(exist_ok=True)

extension = image.split('.')[-1]
download(image, f"{directory}/{id}.{extension}")

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接