python 中的抓取显示 None 值

Scraping in python shows None value

导入请求 从 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 价值任何想法如何从这个网站抓取数据将不胜感激。

您要搜索的标签不在源代码中,这就是您未返回任何数据的原因。你有什么理由期望它在那里吗?您在浏览器中看到的源代码可能与使用请求库拉取时看到的不同。

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

    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 异步填充。幸运的是,记录浏览器的网络流量会显示对 REST API 的请求,它以 JSON 的形式提供 table 的内容。以下脚本向 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())