Очистка экрана динамической веб-страницы в python с Ghost.py

#javascript #python #screen #screen-scraping #ghost.py

#javascript #python #экран #очистка экрана #ghost.py

Вопрос:

 ghost = Ghost()
page, rcs = ghost.open(https://soundcloud.com/passionpit/sets/favorites)
page, rcs = ghost.wait_for_page_loaded()
songs = ghost.evaluate("document.getElementsByClassName('soundTitle__title');")
print songs
 

Я пытаюсь использовать приведенный выше код, чтобы найти все HTML-элементы на приведенной выше странице, которые имеют класс ‘soundTitle__title’, однако на данный момент мой вывод

 QFont::setPixelSize: Pixel size <= 0 (0)
({PyQt4.QtCore.QString(u'length'): 0.0}, [])
 

Кто-нибудь может помочь мне понять, в чем моя проблема? Когда я запускаю document.getElementsByClassName('soundTitle__title') консоль своих браузеров, я получаю ожидаемый результат, почему вывод Python отличается?

Или есть какой-то способ для меня использовать Ghost.py или другая подобная библиотека для получения исходного кода страницы после запуска JavaScript (источник, видимый при проверке элемента с помощью инструментов разработчика браузера)?

Комментарии:

1.Извините, но я просто должен сделать это с lxml.html . from lxml import html html.parse("https://soundcloud.com/passionpit/sets/favorites").getroot().cssselect(".soundTitle__title")

2. Я попытался запустить ваш код и столкнулся с некоторыми проблемами. Мой вывод IOError: Error reading file 'https://soundcloud.com/passionpit/sets/favorites': failed to load external entity "https://soundcloud.com/passionpit/sets/favorites"

3. Оказывается, html.parse не может загрузить https.

4. Есть SoundCloud API — кое-что для разработчиков.

5. Существует даже оболочка Python для SoundCloud API

Ответ №1:

Я получил эту работу и рекомендовал бы использовать Splinter, который в основном просто запускает phantomjs и selenium под капотом.

Вам нужно будет запустить pip install splinter , а также установить phantomjs на свой компьютер, либо загрузив / отключив, либо npm -g install phantomjs , если у вас есть npm и т. Д. Но в целом установка и зависимости минимальны и просты.

Следующий код возвращает ‘Ryn Weaver — OctaHate’, который, я полагаю, является тем, что вы ищете, хотя без дополнительного контекста я не могу быть полностью уверен.

 from splinter import Browser

browser = Browser('phantomjs')
browser.visit('https://soundcloud.com/passionpit/sets/favorites')
songs = browser.find_by_xpath("//a[contains(@class, 'soundTitle__title')]")
if songs:
    for song in songs:
        print song.text
else:
    print "there aren't any songs"
 

Вы также заметите, что мне пришлось выполнить xpath-contains, чтобы получить описание класса, которое вы искали; таким образом, вы можете столкнуться с проблемой при попытке получить доступ к этому классу с помощью используемой вами нотации — есть элемент span, а также элемент anchor, которые оба содержат ‘soundTitle__title’ но, насколько я мог судить, текст был только у элемента ‘a’, и я бы предположил, что это то, что вы ищете. Но если вы хотите оба, вы могли бы просто сделать browser.find_by_xpath("//*[contains(@class, 'soundTitle__title')]")