python中的刮片显示无值

2024-10-01 07:36:35 发布

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

导入请求 从bs4导入BeautifulSoup作为bs 导入csv

r=请求。获取('https://portal.karandaaz.com.pk/dataset/total-population/1000') 汤=bs(r.text) table=soup.find_all(class='ag-header-cell-text')

这对我来说毫无价值,如果你知道如何从这个网站上获取数据,我将不胜感激


Tags: csvtexthttpscombstabledatasetportal
2条回答

您正在搜索的标记不在源代码中,这就是您不返回任何数据的原因。你有什么理由期待这一切发生吗?您在浏览器中看到的源代码可能与使用请求库提取源代码时看到的源代码不同

您可以通过以下方式查看正在提取的代码:

    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 )

BeautifulSoup只能看到在最初请求资源时直接烘焙到该资源HTML中的内容。您试图获取的内容不会烘焙到页面中,因为通常,当您在浏览器中查看此特定页面时,DOM是使用JavaScript异步填充的。幸运的是,记录浏览器的网络流量会显示对RESTAPI的请求,该API将表的内容作为JSON提供。以下脚本向该API发出HTTP GET请求,给定所需的"dataset_id"(您可以根据需要更改paramsdict中的键值对)。然后将响应转储到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())

相关问题 更多 >