Не удается найти элемент с запросами / BeautifulSoup

Я пишу веб-парсер с запросами и BeautifulSoup, и в DOM есть элемент, который я не могу найти.

Вот что я делаю:

import requests
from bs4 import BeautifulSoup
r = requests.get('http://www.decitre.fr/rechercher/result/?q=victor+hugo&search-scope=3')
soup = BeautifulSoup(r.text)

Элемент, который я не могу найти, - это «старая цена» (та, которая зачеркнута), которую я вижу, когда проверяю DOM с помощью инструмента разработчика браузера.

soup.find_all(class_='old-price') # returns [], no matter if I specify "span"

Более того, я не вижу ни строки «старая цена» в супе, ни результата запроса:

'old-price' in soup.text # False
'old-price' in r.text # False 

Я не вижу этого, когда тоже получаю исходник с wget.

Я могу получить его родительский элемент div, но не могу найти внутри него дочерние элементы цены:

commands = soup.find_all(class_='product_commande')
commands[0].find_all('old-price') # []

Так что я понятия не имею, что происходит. Что мне не хватает?

  • я плохо использую request / BeautifulSoup? (Я не уверен, возвращает ли r.text полный html)
  • эта html-часть сгенерирована с помощью кода javascript? если да, то как я могу это узнать и есть ли способ получить полный HTML?

огромное спасибо


person Ehvince    schedule 06.11.2013    source источник
comment
Возможно, элемент old-price создается после выполнения некоторого javascript кода.   -  person Paulo Bu    schedule 06.11.2013
comment
Это динамически загружаемый элемент JavaScript, так что, возможно, попробуйте python Ghost [jeanphix.me/Ghost.py /], чтобы загрузить веб-сайт и затем проанализировать его содержимое с помощью BeautifulSoup (или Ghost с помощью JS-запроса)   -  person dorvak    schedule 06.11.2013
comment
Похоже, Призрак - лучший вариант, спасибо. «Выполнение javascript внутри фрейма webkit - одна из самых интересных функций, предоставляемых Ghost». Постараюсь как можно скорее.   -  person Ehvince    schedule 06.11.2013


Ответы (1)


В моем случае я передавал недопустимый HTML в Beautiful Soup, из-за чего он игнорировал все, что находится после недопустимого тега в начале документа:

<!--?xml version="1.0" encoding="iso-8859-1"?-->

Обратите внимание, что я также использую Ghost.py. Вот как я удалил метку.

#remove invalid xml tag
ghostContent = ghost.content
invalidCode = '<!--?xml version="1.0" encoding="iso-8859-1"?-->'
if ghostContent.startswith(invalidCode):
    ghostContent = ghostContent[len(invalidCode):]

doc = BeautifulSoup(ghostContent)     

#test to see if we can find text   
if 'Application Search Results' in doc.text:
    print 'YES!'
person AfromanJ    schedule 05.02.2014