Extraer imagen src basado en atributo con BeautifulSoup

Estoy usando BeautifulSoup para obtener una página HTML de IMDb, y me gustaría extraer la imagen del póster de la página. Tengo la imagen basada en uno de los atributos, pero no sé cómo extraer los datos que contiene.

Aquí está mi código:

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')) 

Ya casi estás ahí, solo un par de errores. soup.find() obtiene el primer elemento que coincide, no una lista, por lo que no necesita iterar sobre él. Una vez que tenga el elemento, puede obtener sus atributos (como src ) mediante el acceso al diccionario. Aquí hay una versión reelaborada:

 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 

He cambiado id a film_id , porque id() es una función incorporada, y es una mala práctica ocultarlos.

Creo que tu ejemplo es muy cercano. Debe usar findAll () en lugar de find () y cuando itera, cambia de src al enlace. En el siguiente ejemplo lo cambié a tag

Este código me funciona con 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']) 

Si entiendo correctamente, está buscando el src de la imagen, para su extracción después de eso.

En primer lugar, debe encontrar (con el inspector) en qué posición del HTML es la imagen. Por ejemplo, en mi caja de partículas que estaba desechando escudos del equipo de fútbol, ​​necesitaba:

 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'] 

Entonces, necesitas procesar la imagen. Tienes que opciones.

1º: utilizando 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)

2º Uso de la biblioteca de imágenes scikit (que probablemente necesitará instalar):

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

Nota: Solo en este ejemplo en particular necesitaba agregar http: al principio.

¡Espero eso ayude!