首页 > 解决方案 > 如何嵌入或抓取 Socrata 数据集 API 文档页面中给出的“关于此数据集”部分?

问题描述

此页面链接适用于公共NYC 数据集的 Socrata API 文档页面:

在页面的右上角,有一个colophon/cartouche,其中列出了有关数据集的一些信息: “About This Dataset”

它的最后一行启用了“嵌入论文文档”所需的代码副本。我试过了。它可以工作,但整个页面都是嵌入的。

每次访问数据集时,我都想嵌入此版权页,以便在报告中显示此信息。

我知道这些信息在 html 树中的位置:

<body class="dev foundry 200" ...>
  ...
  <div class="container-fluid content">
    ...
    <div id="foundry-docs">
       ...
       <div class="pull-right sidebar metadata">
          <div class="panel panel-info about">
            ...
            < div class="panel-body">
              <ul>
              <li>...</li>  ==> items (9) needed

因此,我尝试使用 beautifulsoup 来抓取这些信息:

from bs4 import BeautifulSoup
import requests

data_api_page = 'https://dev.socrata.com/foundry/data.cityofnewyork.us/qiz3-axqb'  


page = requests.get( data_api_page )

print(page.status_code)
print(page.headers['content-type'])

soup = BeautifulSoup(page.text, 'html.parser')

all_divs = soup.find(name='div', attrs={'class':'panel panel-info about'})
for tag in all_divs.children:
    print(tag)

没有返回任何内容(即使使用 find_all):我做错了什么?

谢谢你的帮助!

PS:除了使用此信息注释报告之外,另一个原因是我想在访问数据集之前检索数据集行数,以绕过 Socrata API 的 1000 条记录限制(v2.1 具有与以前的版本)并检索整个数据集。

标签: beautifulsouppython-requestssocrata

解决方案


我有这个更好的解决方案,它不涉及在所有行上发送 SQL 计数:

def get_rows_from_metadata(metadata):
    rows = -1  #something went wrong if output
    for c in metadata['columns']:
        if c['name'] == 'UNIQUE KEY':
            try:
                rows = int(c['cachedContents']['not_null'])
            except:
                rows = 0
            break

    return rows

dataset_rows = get_rows_from_metadata(metadata)

推荐阅读