首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Python中完成呈现后如何刮取网页的HTML内容

问在Python中完成呈现后如何刮取网页的HTML内容
EN

Stack Overflow用户
提问于 2016-03-28 14:29:36
回答 1查看 2K关注 0票数 2

我现在的任务是刮一些流行的笑话网站。一个例子是一个名为jokes.cc.com的网站。如果您访问该网站,将光标悬停在页面左侧的“获取随机笑话”按钮之上,您将注意到它重定向到的链接将是jokes.cc.com/#。

如果你等待一段时间,它会改变为一个正确的链接,在网站上显示实际的笑话。它将更改为jokes.cc.com/*legit joke link*。

如果分析页面的HTML,您会注意到有一个带有class=random_link的链接(class=random_link),该链接的<href>将链接存储到页面希望重定向的随机笑话。在页面完全加载之后,您可以检查它。基本上,“#”被一个合法的链接所取代。

现在,这是我的代码,以刮掉HTML,就像我对静态网站所做的那样。我使用过BeautifulSoup库:

代码语言:javascript
复制
import urllib
from bs4 import BeautifulSoup

urlToRead = "http://jokes.cc.com";
handle = urllib.urlopen(urlToRead)
htmlGunk =  handle.read()
soup = BeautifulSoup(htmlGunk, "html.parser")
# Find out the exact position of the joke in the page
print soup.findAll('a', {'class':'random_link'})[0]

产出:#

这是预期的输出,因为我已经意识到,该页尚未完全呈现。

在等待了一段时间之后,或者在呈现完成之后,我如何刮掉页面。我需要使用像机械化这样的外部库吗?我不知道该怎么做,所以我们很感谢你的帮助/指导

编辑:通过在Python中使用PhantomJS和Selenium,我终于能够解决我的问题。以下是在呈现完成后获取页面的代码。

代码语言:javascript
复制
from bs4 import BeautifulSoup
from selenium import webdriver


driver = webdriver.PhantomJS() #selenium for PhantomJS
driver.get('http://jokes.cc.com/')
soupFromJokesCC = BeautifulSoup(driver.page_source) #fetch HTML source code after rendering
# locate the link in HTML
randomJokeLink = soupFromJokesCC.findAll('div', {'id':'random_joke'})[0].findAll('a')[0]['href']
# now go to that page and scrape the joke from there
print randomJokeLink #It works :D
EN

回答 1

Stack Overflow用户

发布于 2016-03-28 14:48:30

您要查找的数据是通过在页面加载时动态运行的JavaScript生成的。BeautifulSoup没有JavaScript引擎,所以不管等待多长时间,链接都不会改变。有一些Python库可以抓取和理解JavaScript,但您最好的选择可能是挖掘和计算网站上JS的实际工作方式。例如,如果他们的笑话是随机抽取的,那么它可能是像JSON这样的格式,Python可以很容易地解析这种格式。这将使您的应用程序比包含一个完整的脚本引擎更加轻量级。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36264427

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档