Beautifulsoup не может извлечь данные, используя attrs=class

Я извлекаю данные для исследовательского проекта и успешно использовал findAll('div', attrs={'class':'someClassName'}) на многих веб-сайтах, но на этом конкретном веб-сайте

Ссылка на веб-сайт< /а>

не возвращает никаких значений, когда я использовал опцию attrs. Но когда я не использую опцию attrs, я получаю весь html dom.

Вот простой код, с которого я начал его тестировать:

soup = bs(urlopen(url))
for div in soup.findAll('div', attrs={'class':'data'}):
    print div

person add-semi-colons    schedule 29.07.2012    source источник
comment
При получении через urllib2 элемент с данными класса отсутствует.   -  person Ansari    schedule 30.07.2012
comment
Я использовал его на другом веб-сайте, и он отлично работает с urllib2.   -  person add-semi-colons    schedule 30.07.2012
comment
Возможно, Amazon предоставляет другой контент для полнофункциональных браузеров.   -  person Ansari    schedule 30.07.2012


Ответы (2)


Мой код работает нормально, с requests

import requests
from BeautifulSoup import BeautifulSoup as bs
#grab HTML
r = requests.get(r'http://www.amazon.com/s/ref=sr_pg_1?rh=n:172282,k%3adigital%20camera&keywords=digital%20camera&ie=UTF8&qid=1343600585')
html = r.text
#parse the HTML
soup = bs(html)

results= soup.findAll('div', attrs={'class': 'data'})

print results
person TankorSmash    schedule 30.07.2012
comment
вместо запроса я хочу использовать urlopen, и, как ни странно, с urlopen я не могу получить дом. - person add-semi-colons; 30.07.2012
comment
Извините, я ничего не знаю о urlopen. Почему бы вместо этого не использовать запросы? docs.python-requests.org/en/latest/index.html - person TankorSmash; 30.07.2012

Если вы или кто-либо, читающий этот вопрос, хотел бы знать причину, по которой код не смог найти значение attrs, используя указанный вами код (скопировано ниже):

soup = bs(urlopen(url))
for div in soup.findAll('div', attrs={'class':'data'}):
    print div

Проблема заключается в том, что вы пытались создать объект BeautifulSoup soup = bs(urlopen(url)), поскольку значение urlopen(url) является объектом ответа, а не DOM.

Я уверен, что любые проблемы, с которыми вы столкнулись, можно было бы легче решить, используя вместо этого bs(urlopen(url).read()).

person jtreleaven    schedule 27.07.2014