python中的抓取显示无值[重复]
Posted
技术标签:
【中文标题】python中的抓取显示无值[重复]【英文标题】:Scraping in python shows None value [duplicate] 【发布时间】:2021-06-27 16:38:45 【问题描述】:导入请求 从 bs4 导入 BeautifulSoup 作为 bs 导入csv
r = requests.get('https://portal.karandaaz.com.pk/dataset/total-population/1000') 汤= bs(r.text) table = soup.find_all(class_='ag-header-cell-text')
这给了我 None 价值任何想法如何从该站点抓取数据将不胜感激。
【问题讨论】:
【参考方案1】:您要搜索的标签不在源代码中,这就是您没有返回任何数据的原因。你有什么理由期望它存在吗?您在浏览器中看到的源代码可能与使用请求库拉取源代码时看到的不同。
您可以通过以下方式查看被拉取的代码:
import requests
from bs4 import BeautifulSoup as bs
import csv
r = requests.get('https://portal.karandaaz.com.pk/dataset/total-population/1000')
soup = bs(r.text, "lxml")
print( soup )
【讨论】:
是的,我正在查看检查代码,它给了我我在代码中编写的内容,但你是对的,我在 jupyter 中的代码不同,不知道如何,我对抓取很陌生还在学习。谢谢 可能在您的浏览器中执行了一些 javascript 来生成此 html。下面的答案包含有关如何解决此问题的更多信息。【参考方案2】:BeautifulSoup 只能看到在最初请求资源时直接烘焙到资源 HTML 中的内容。您尝试抓取的内容不会被嵌入到页面中,因为通常,当您在浏览器中查看此特定页面时,DOM 会使用 JavaScript 异步填充。幸运的是,记录浏览器的网络流量会显示对 REST API 的请求,该 API 以 JSON 形式提供表的内容。以下脚本向该 API 发出 HTTP GET 请求,给定所需的 "dataset_id"
(您可以根据需要更改 params
字典中的键值对)。然后将响应转储到 CSV 文件中:
def main():
import requests
import csv
url = "https://portal.karandaaz.com.pk/api/table"
params =
"dataset_id": "1000"
response = requests.get(url, params=params)
response.raise_for_status()
content = response.json()
filename = "dataset_.csv".format(params["dataset_id"])
with open(filename, "w", newline="") as file:
fieldnames = content["data"]["columns"]
writer = csv.DictWriter(file, fieldnames=fieldnames)
writer.writeheader()
for row in content["data"]["rows"]:
writer.writerow(dict(zip(fieldnames, row)))
return 0
if __name__ == "__main__":
import sys
sys.exit(main())
【讨论】:
谢谢保罗。你的代码在我看来很复杂,它给了我一个“没有名为 'env 的模块”的错误任何想法? @SajjadAli 抱歉,我在复制粘贴代码时出错了。前两行不应该在那里。刷新页面并尝试我更新的代码。 谢谢保罗。您节省了我一天的时间来寻找解决方案。 *** 只是摇滚我刚刚注册并提出问题并得到了我正在寻找的答案。顺便说一句,您是如何找到其他网址的?它超出了我的想象。 @SajjadAli 不客气。关于 URL,您可能想阅读 this answer 我发布的另一个问题,其中有人试图抓取有关葡萄酒和葡萄园的信息。在其中,我解释了记录浏览器网络流量所需采取的步骤,以及如何制定对 API 的请求。以上是关于python中的抓取显示无值[重复]的主要内容,如果未能解决你的问题,请参考以下文章