首页 > 解决方案 > 我的代码返回一个空列表我该如何解决?

问题描述

我尝试使用 beautifulsoup 模块从网站获取数据,但它返回空列表,但我不想使用 selenium,这可能吗?我只想使用 beautifulsoup 模块。我正在使用 MacOS。

我的代码是:

import requests
from bs4 import BeautifulSoup

r = requests.get("https://data.ibb.gov.tr/dataset/saatlik-trafik-yogunluk-veri-seti/resource/93f996f1-70da-4500-951a-693c7e7066f6/view/9a2a6a74-c7f5-4e2d-96d5-21a57ef7a889")
soup = BeautifulSoup(r.content,"html")
result = soup.find_all("div", attrs={"class":"recline-slickgrid slickgrid_284950 ui-widget"})
print(result)

标签: pythonbeautifulsoup

解决方案


你很幸运。访问此特定页面时,您的浏览器向 REST API 发出 HTTP POST 请求,该 API 返回包含表中实际数据的 JSON。通常,这些数据随后用于使用 JavaScript 异步填充 DOM。如果您模仿该请求,则无需使用Selenium,或其他一些无头浏览器。你甚至不需要BeautifulSoup,只是requests

def main():

    import requests

    url = "https://data.ibb.gov.tr/api/3/action/datastore_search"

    data = {
        "resource_id": "93f996f1-70da-4500-951a-693c7e7066f6",
        "filters": {},
        "limit": 10,
        "offset": 0
    }

    response = requests.post(url, data=data)
    response.raise_for_status()

    for record in response.json()["result"]["records"]:
        print(f"Latitude: {record['LATITUDE']}, Longitude: {record['LONGITUDE']}")

    return 0


if __name__ == "__main__":
    import sys
    sys.exit(main())

输出:

Latitude: 41.0202026367188, Longitude: 28.9105224609375
Latitude: 41.0531616210938, Longitude: 28.6248779296875
Latitude: 41.1849975585938, Longitude: 28.8226318359375
Latitude: 41.0476684570312, Longitude: 28.8665771484375
Latitude: 41.0476684570312, Longitude: 29.1522216796875
Latitude: 40.8828735351562, Longitude: 29.3170166015625
Latitude: 41.1520385742188, Longitude: 28.7896728515625
Latitude: 40.8828735351562, Longitude: 29.3719482421875
Latitude: 40.9927368164062, Longitude: 28.9215087890625
Latitude: 41.0806274414062, Longitude: 28.9215087890625
>>> 

在这段代码中,每一个record对应一个字典,字典中有各种键值对。除了经纬度之外,表格中的其他列都是可用的,例如平均速度、日期和时间等。

您可以将有效负载字典"limit": 10中的键值对更改为data您想要的任何值。在这种情况下,我只想要前十个条目。

但是,一般来说,如果您尝试从使用 JavaScript 异步填充的页面中抓取信息,并且它不公开简单的 REST API,那么BeautifulSouprequests不会帮助您。在这种情况下,您将需要一个无头浏览器SeleniumPlaywright模拟完整的浏览会话。


推荐阅读