Python: BeautifulSoup extrait du texte de la balise d'ancrage

Je veux extraire le texte du src suivant de la balise image et du texte de la balise d'ancrage qui se trouve dans les données de la classe div.

J'ai réussi à extraire le src img mais j'ai du mal à extraire le texte de la balise d'ancrage.

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

Voici le lien pour l'ensemble de la page HTML

Voici mon code

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

Ce que j'essaie de faire est d'extraire l'image src (link) et le titre dans le côté de la classe div=data.

Ainsi, par exemple,

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

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

21
demandé sur Null-Hypothesis 2012-07-30 10:32:24

5 réponses

Cela aidera:

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 vous recherchez des produits Amazon, vous devriez utiliser L'API officielle. Il y a au moins un paquet Python qui facilitera vos problèmes de raclage et gardera votre activité dans les conditions d'utilisation.

35
répondu gauden 2018-09-20 20:38:21

Dans mon cas, cela a fonctionné comme ça:

from BeautifulSoup import BeautifulSoup as bs

url="http://blabla.com"

soup = bs(urllib.urlopen(url))
for link in soup.findAll('a'):
        print link.string

J'espère que ça aide!

13
répondu Pontios 2015-12-01 11:43:27

Je suggère d'aller sur la route lxml et d'utiliser xpath.

from lxml import etree
# data is the variable containing the html
data = etree.HTML(data)
anchor = data.xpath('//a[@class="title"]/text()')
4
répondu justinfay 2012-07-31 09:01:44

Toutes les réponses ci-dessus m'aident vraiment à construire ma réponse, à cause de cela j'ai voté pour toutes les réponses que les autres utilisateurs l'ont mises: mais j'ai finalement mis en place ma propre réponse au problème exact auquel je traitais:

Comme question clairement définie, j'ai dû accéder à certains des frères et sœurs et à ses enfants dans une structure dom: Cette solution va parcourir les images de la structure dom et construire le nom de l'image en utilisant le titre du produit et enregistrer l'image dans le répertoire 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)
3
répondu Null-Hypothesis 2012-07-30 21:40:39
>>> txt = '<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> '
>>> fragment = bs4.BeautifulSoup(txt)
>>> fragment
<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> 
>>> fragment.find('a', {'class': 'title'})
<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>
>>> 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)'
1
répondu Jon Clements 2012-07-30 17:57:38