为什么li没有显示python请求响应?

2024-09-30 16:41:25 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个家庭作业项目和网络抓取,我想从一个学校网站收集一个月的所有偶数信息。我用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创建的信息,这是一种完美的方法!在


Tags: import信息url内容链接count事件页面
2条回答

有些链接是用js生成的,但是您只需使用请求就可以从json格式的十个事件中获取所有事件数据:

import requests

params = {"pageNum": "1",
          "date": "06012016",
          "type": "day",
          "isSearch": "false",
          "pubCalId": "GRP1322"}

r = requests.get("https://apps.iu.edu/ccl-prd/events/view/page", params=params)

for ev in r.json()["events"][0]["events"]:
    print ev

这给了你:

^{pr2}$

单击more或摘要标题时弹出的大多数信息都包含在json中。在

要获取开始时间和摘要:

for ev in r.json()["events"][0]["events"]:
    print(ev["startDate"])
    print ev["summary"]

这给了你:

Summer 2016: Withdrawal with Grade of W or F for First Six Week classes
8:00am
Exhibit: Student Reform Movements at IU
9:00am
EXHIBIT: "Indiana Folk Arts: 200 Years of Tradition and Innovation"
9:00am
EXHIBIT: "Stirring the Pot: Bringing the Wanamakers Home"
9:00am
EXHIBIT:  "Cherokee Craft, 1973"
9:00am
EXHIBIT: "MONSTERS!'
9:00am
EXHIBIT: "Tools of Travel"
9:00am
EXHIBIT: "Thoughts, Things, and Theories...What Is Culture?"
10:00am
New in the Galleries
12:00pm
PAPF and G&M Summer Research Workshop

我查看了页面的源代码,在纯HTML中,有25个<a>元素具有href属性。这是你的脚本正在寻找的25个链接。在

另外,我不确定页面上的哪些事件是您真正要查找的,但是我想打印出来的这些url中的许多(如果不是全部)实际上并不是您要查找的事件(稍后将对此进行详细介绍)。在

当您在浏览器中访问页面时,找不到其他链接的原因是,它们是使用JavaScript生成的。beauthoulsoup只查看纯HTML,不运行任何JavaScript,因为它只是一个分析和修改静态HTML或XML文件的工具。来自their documentation

Beautiful Soup is a Python library for pulling data out of HTML and XML files. It works with your favorite parser to provide idiomatic ways of navigating, searching, and modifying the parse tree.

您需要利用JavaScript引擎来实际生成这些元素,或者找出这个页面从哪里提取事件列表,然后到那里获取数据。在

您可以尝试使用类似Selenium的真正的浏览器,它甚至允许您在DOM中搜索类似于BeautifulSoup的DOM,这样就不需要同时使用BeautifulSoup。但是,如果您坚持使用beauthoulsoup,那么可以使用Selenium来控制浏览器,以便它使用JavaScript生成元素(因为浏览器是自动执行的),然后让Selenium通过调用以下命令(driver.page_source只会得到requests提供给您的内容)来控制浏览器:

html = driver.execute_script("return document.getElementsByTagName('html')[0].innerHTML")

还有一些无头浏览器(“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)(是的,你能做到的,这太棒了。在

我不确定你的任务的具体标准,所以我不知道这些选项是否与它们有冲突。但我希望我至少给你指明了正确的方向。在

相关问题 更多 >