BeautifulSoup: extraer texto de la etiqueta de anclaje

Quiero extraer:

  • texto de la siguiente fuente de la etiqueta de image y
  • Texto de la etiqueta de anclaje que está dentro de los datos de clase div

Logré extraer el img src con éxito, pero tengo problemas para extraer el texto de la etiqueta de anclaje.

 Nikon COOLPIX L26 16.1 MP Digital Camera with 5x Zoom NIKKOR Glass Lens and 3-inch LCD (Red) 

Aquí está el enlace para toda la página HTML .

Aquí está mi código:

 for div in soup.findAll('div', attrs={'class':'image'}): print "\n" for data in div.findNextSibling('div', attrs={'class':'data'}): for a in data.findAll('a', attrs={'class':'title'}): print a.text for img in div.findAll('img'): print img['src'] 

Lo que estoy tratando de hacer es extraer la imagen src (enlace) y el título dentro de la div class=data , así que por ejemplo:

  Nikon COOLPIX L26 16.1 MP Digital Camera with 5x Zoom NIKKOR Glass Lens and 3-inch LCD (Red) 

debe extraer:

Nikon COOLPIX L26 16.1 MP Digital Camera with 5x Zoom NIKKOR Glass Lens and 3-inch LCD (Red)

Esto ayudará:

 from bs4 import BeautifulSoup data = ''' ''' soup = BeautifulSoup(data) for div in soup.findAll('div', attrs={'class':'image'}): print(div.find('a')['href']) print(div.find('a').contents[0]) print(div.find('img')['src']) 

Si está buscando productos de Amazon, debería utilizar la API oficial. Hay al menos un paquete de Python que aliviará sus problemas de raspado y mantendrá su actividad dentro de los términos de uso.

En mi caso, funcionó así:

 from BeautifulSoup import BeautifulSoup as bs url="http://blabla.com" soup = bs(urllib.urlopen(url)) for link in soup.findAll('a'): print link.string 

¡Espero eso ayude!

Yo sugeriría ir a la ruta lxml y usar xpath.

 from lxml import etree # data is the variable containing the html data = etree.HTML(data) anchor = data.xpath('//a[@class="title"]/text()') 

Todas las respuestas anteriores realmente me ayudaron a construir mi respuesta, debido a esto voté por todas las respuestas que otros usuarios publicaron: Pero finalmente puse mi propia respuesta al problema exacto con el que estaba tratando:

Como se definió claramente la pregunta, tuve que acceder a algunos de los hermanos y sus hijos en una estructura de dom: esta solución recorrerá las imágenes en la estructura de dom y construirá el nombre de la imagen con el título del producto y guardará la imagen en el directorio local.

 import urlparse from urllib2 import urlopen from urllib import urlretrieve from BeautifulSoup import BeautifulSoup as bs import requests def getImages(url): #Download the images r = requests.get(url) html = r.text soup = bs(html) output_folder = '~/amazon' #extracting the images that in div(s) for div in soup.findAll('div', attrs={'class':'image'}): modified_file_name = None try: #getting the data div using findNext nextDiv = div.findNext('div', attrs={'class':'data'}) #use findNext again on previous object to get to the anchor tag fileName = nextDiv.findNext('a').text modified_file_name = fileName.replace(' ','-') + '.jpg' except TypeError: print 'skip' imageUrl = div.find('img')['src'] outputPath = os.path.join(output_folder, modified_file_name) urlretrieve(imageUrl, outputPath) if __name__=='__main__': url = r'http://www.amazon.com/s/ref=sr_pg_1?rh=n%3A172282%2Ck%3Adigital+camera&keywords=digital+camera&ie=UTF8&qid=1343600585' getImages(url) 
 >>> txt = 'Nikon COOLPIX L26 16.1 MP Digital Camera with 5x Zoom NIKKOR Glass Lens and 3-inch LCD (Red) ' >>> fragment = bs4.BeautifulSoup(txt) >>> fragment Nikon COOLPIX L26 16.1 MP Digital Camera with 5x Zoom NIKKOR Glass Lens and 3-inch LCD (Red) >>> fragment.find('a', {'class': 'title'}) Nikon COOLPIX L26 16.1 MP Digital Camera with 5x Zoom NIKKOR Glass Lens and 3-inch LCD (Red) >>> fragment.find('a', {'class': 'title'}).string u'Nikon COOLPIX L26 16.1 MP Digital Camera with 5x Zoom NIKKOR Glass Lens and 3-inch LCD (Red)'