Python: BeautifulSoup извлекает текст из тега привязки

Я хочу извлечь текст из следующего src тега изображения и текста тега привязки, который находится внутри данных класса div.

Я успешно удаляю img src, но у меня возникают проблемы с извлечением текста из тега привязки.

<a class="title" href="#" onclick="location.href='http://rads.stackoverflow.com/amzn/click/B0073HSK0K'; return false;">Nikon COOLPIX L26 16.1 MP Digital Camera with 5x Zoom NIKKOR Glass Lens and 3-inch LCD (Red)</a> 

Вот ссылка на всю HTML-страницу

Вот мой код

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

То, что я пытаюсь сделать, - извлечь изображение src (link) и заголовок в стороне из div class= data.

например,

 <a class="title" href="#" onclick="location.href='http://rads.stackoverflow.com/amzn/click/B0073HSK0K'; return false;">Nikon COOLPIX L26 16.1 MP Digital Camera with 5x Zoom NIKKOR Glass Lens and 3-inch LCD (Red)</a> 

Я хочу извлечь: Nikon COOLPIX L26 16.1 MP Digital Camera with 5x Zoom NIKKOR Glass Lens and 3-inch LCD (Red)

Ответы

Ответ 1

Все приведенные выше ответы действительно помогают мне построить мой ответ, из-за этого я проголосовал за все ответы, высказанные другими пользователями: Но я, наконец, собрал свой собственный ответ на конкретную проблему, с которой я имел дело:

В качестве четко заданного вопроса мне приходилось обращаться к некоторым из братьев и сестер и к его дочерним элементам в структуре dom: это решение будет перебирать изображения в структуре dom и конструировать имя изображения с использованием названия продукта и сохранять изображение в локальном каталоге.

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)

Ответ 2

Это поможет:

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

Если вы ищете продукты Amazon, вы должны использовать официальный API. Существует не менее один пакет Python, который облегчит ваши проблемы с очисткой и сохранит вашу деятельность в условиях использования.

Ответ 3

В моем случае он работал так:

from BeautifulSoup import BeautifulSoup as bs

url="http://blabla.com"

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

Надеюсь, что это поможет!

Ответ 4

Я бы предложил перейти к lxml-маршруту и ​​использовать xpath.

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

Ответ 5

>>> txt = '<a class="title" href="#" onclick="location.href='http://rads.stackoverflow.com/amzn/click/B0073HSK0K'; return false;">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="#" onclick="location.href='http://rads.stackoverflow.com/amzn/click/B0073HSK0K'; return false;">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="#" onclick="location.href='http://rads.stackoverflow.com/amzn/click/B0073HSK0K'; return false;">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)'