使用Ghost.py在Python中抓取动态网页
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
我正在尝试使用上面的代码来找到页面上所有具有'class soundTitle__title'这个类的HTML元素,但现在我的输出结果是
QFont::setPixelSize: Pixel size <= 0 (0)
({PyQt4.QtCore.QString(u'length'): 0.0}, [])
有没有人能帮我看看我的问题出在哪里?当我在浏览器的控制台运行 document.getElementsByClassName('soundTitle__title')
时,得到的结果是我期待的,为什么Python的输出却不同呢?
或者有没有办法让我使用Ghost.py或其他类似的库,在JavaScript运行后获取页面的源代码(也就是在浏览器开发者工具中检查元素时看到的源代码)?
1 个回答
4
我把这个搞定了,推荐你使用Splinter,它其实就是在后台运行phantomjs和selenium。
你需要在你的电脑上运行 pip install splinter
,同时还要安装phantomjs。你可以选择下载解压,或者如果你有npm的话,可以用 npm -g install phantomjs
来安装。总的来说,安装过程和依赖都很简单明了。
下面的代码会返回'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元素和一个锚点元素都包含'soundTitle__title',但据我所知,只有'a'元素有文本,我猜这就是你想要的。如果你想要两个元素的信息,可以直接用 browser.find_by_xpath("//*[contains(@class, 'soundTitle__title')]")
。