#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')]")