usar - scrap with python
Python: BeautifulSoup extrae texto de la etiqueta de anclaje (5)
Quiero extraer el texto de src siguiente de la etiqueta de imagen y el texto de la etiqueta de anclaje que está dentro de los datos de la clase div.
Logré extraer el img src con éxito, pero tengo problemas para extraer el texto de la etiqueta de anclaje.
<a class="title" href="http://rads.stackoverflow.com/amzn/click/B0073HSK0K">Nikon COOLPIX L26 16.1 MP Digital Camera with 5x Zoom NIKKOR Glass Lens and 3-inch LCD (Red)</a>
Aquí está el enlace para toda la página HTML.
Aqui esta mi codigo
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 al lado de la clase div = datos.
así por ejemplo
<a class="title" href="http://rads.stackoverflow.com/amzn/click/B0073HSK0K">Nikon COOLPIX L26 16.1 MP Digital Camera with 5x Zoom NIKKOR Glass Lens and 3-inch LCD (Red)</a>
Quiero extraer: Nikon COOLPIX L26 16.1 MP Digital Camera with 5x Zoom NIKKOR Glass Lens and 3-inch LCD (Red)
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!
Esto ayudará:
from bs4 import BeautifulSoup
data = ''''''<div class="image">
<a href="http://www.example.com/eg1">Content1<img
src="http://image.example.com/img1.jpg" /></a>
</div>
<div class="image">
<a href="http://www.example.com/eg2">Content2<img
src="http://image.example.com/img2.jpg" /> </a>
</div>''''''
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.
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)
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()'')
>>> txt = ''<a class="title" href="http://rads..com/amzn/click/B0073HSK0K">Nikon COOLPIX L26 16.1 MP Digital Camera with 5x Zoom NIKKOR Glass Lens and 3-inch LCD (Red)</a> ''
>>> fragment = bs4.BeautifulSoup(txt)
>>> fragment
<a class="title" href="http://rads..com/amzn/click/B0073HSK0K">Nikon COOLPIX L26 16.1 MP Digital Camera with 5x Zoom NIKKOR Glass Lens and 3-inch LCD (Red)</a>
>>> fragment.find(''a'', {''class'': ''title''})
<a class="title" href="http://rads..com/amzn/click/B0073HSK0K">Nikon COOLPIX L26 16.1 MP Digital Camera with 5x Zoom NIKKOR Glass Lens and 3-inch LCD (Red)</a>
>>> 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)''