我有一个家庭作业项目和网络抓取,我想从一个学校网站收集一个月的所有偶数信息。我用Python处理请求和靓汤。我写了一些代码来获取一个url,并试图从保存事件信息的页面中获取所有的li。然而,当我去抓取所有的li内容时,我发现我并没有收到所有的内容。我一直在想这是因为溢出:隐藏“对于保险商实验室来说,但为什么我能拿到第一批李的呢?在
from bs4 import BeautifulSoup
import requests
url = 'https://apps.iu.edu/ccl-prd/events/view?date=06012016&type=day&pubCalId=GRP1322'
r = requests.get(url)
bsObj = BeautifulSoup(r.text,"html.parser")
eventList = []
eventURLs = bsObj.find_all("a",href=True)
print len(eventURLs)
count = 1
for url in eventURLs:
print str(count) + '. ' + url['href']
count += 1
我打印出这些url是因为我计划转到事件内部的href链接以获得完整的描述和其他元数据。但是,我没有得到所有的事件列表。我只拿到了前5个。我得到的输出中事件的链接是数字19到23。但该页面共有10个事件。在
输出:
^{pr2}$TLDR:当我使用Python请求和beautifulsoup时,我并没有从一个页面上获得lis的所有链接。为什么我没有得到链接,有没有更好的方法来解决这个问题?在
编辑给出答案:我需要的链接都是用Javascript创建的,由于Requests和beautifulsoup不运行Javascript,所以我用PhantomJS迁移到Selenium。但是,下面的答案显示了如何通过在Python请求中使用参数来获取Javascript创建的信息,这是一种完美的方法!在
有些链接是用js生成的,但是您只需使用请求就可以从json格式的十个事件中获取所有事件数据:
这给了你:
^{pr2}$单击more或摘要标题时弹出的大多数信息都包含在json中。在
要获取开始时间和摘要:
这给了你:
我查看了页面的源代码,在纯HTML中,有25个
<a>
元素具有href属性。这是你的脚本正在寻找的25个链接。在另外,我不确定页面上的哪些事件是您真正要查找的,但是我想打印出来的这些url中的许多(如果不是全部)实际上并不是您要查找的事件(稍后将对此进行详细介绍)。在
当您在浏览器中访问页面时,找不到其他链接的原因是,它们是使用JavaScript生成的。beauthoulsoup只查看纯HTML,不运行任何JavaScript,因为它只是一个分析和修改静态HTML或XML文件的工具。来自their documentation:
您需要利用JavaScript引擎来实际生成这些元素,或者找出这个页面从哪里提取事件列表,然后到那里获取数据。在
您可以尝试使用类似Selenium的真正的浏览器,它甚至允许您在DOM中搜索类似于BeautifulSoup的DOM,这样就不需要同时使用BeautifulSoup。但是,如果您坚持使用beauthoulsoup,那么可以使用Selenium来控制浏览器,以便它使用JavaScript生成元素(因为浏览器是自动执行的),然后让Selenium通过调用以下命令(
driver.page_source
只会得到requests
提供给您的内容)来控制浏览器:还有一些无头浏览器(“headless”意味着它没有GUI,所以你永远也看不到它,也不需要显示器),如果你愿意,你可以使用它,或者你的脚本需要在没有显示器的情况下运行(我知道,如果你没有连接显示器,Firefox就不会启动)。如果你真的愿意的话,我可以想象有一种方法可以在这些浏览器中使用beauthoulsoup。在
{{6}你可以用一个{cd3}函数把数据从cd3}中拉出来,如果你可以用cd3}把这个文件从cd6}中取出来。在
如果您使用的是一个HTML解析器(例如beauthulsoup、Selenium),那么您一定应该尝试缩小搜索这些链接的范围,方法是在页面上找到包含所有这些
<a>
元素的元素,然后在元素对象上调用.find_all("a", href=True)
(对于beauthulsoup)或.find_elements_by_css_selector("a[href]")
(对于Selenium)(是的,你能做到的,这太棒了。在我不确定你的任务的具体标准,所以我不知道这些选项是否与它们有冲突。但我希望我至少给你指明了正确的方向。在
相关问题 更多 >
编程相关推荐