【问题标题】:Not Getting All Results from soup.findAll()没有从 soup.findAll() 获得所有结果
【发布时间】:2020-08-14 15:18:07
【问题描述】:

我在一个网站上找到了这张表 (https://covid.knoxcountytn.gov/case-count.html):

<table class="table table-striped" id="cases_table"></table>

(我这里删除了表体,因为它很长),我需要一种方法来获取其中的数据。

这两个都没有返回:

table=soup.findAll('table', {'id': 'cases_table'})
table = soup.select('table#cases_table')

还有这个:

table=soup.findAll('tbody')

返回一个不是我要查找的 tbody。

我也试过用这个:

table = soup.find_all('table')[x] 

当 x 为 0 时,我得到一个我不想要的表。当 x 为 1 时,我得到一个 index is out of range 错误。

我尝试过使用 lxml、html5lib 和 html.parser,但它们都没有改变这一点。

如果有任何其他有效的方法来解决这个问题(我正在尝试在这个网站上获取活跃的案例,因为该州没有每天发布它,约翰霍普金斯大学也没有),请告诉我.

附:我认为问题出在请求模块上,因为当我将带有请求命令的页面下载到文本文件时,该部分也丢失了。

【问题讨论】:

  • 要获取表中的所有数据吗?
  • 那很好,但我真的只需要活动案例(或者恢复的案例,它们是可以互换的)。

标签: html python-3.x web-scraping beautifulsoup python-requests


【解决方案1】:

如果你查看页面的源代码,你不会看到&lt;table class="table table-striped" id="cases_table"&gt;&lt;/table&gt;这个元素。它使用ajax来加载它。但是你可以直接获取数据:

import requests
import csv, io

url = "https://covid.knoxcountytn.gov/includes/covid_cases.csv"

content_of_csv = requests.get(url).text

for i in csv.reader(io.StringIO(content_of_csv)):
    if i[0] == "Number of Active Cases":
        print("The number: " + i[1], "Percent: " + i[2])

结果:

The number: 2192 Percent: 42.70%

【讨论】:

  • 非常感谢这一切都很好!我对网站的工作方式非常陌生,我不知道/想查看 covid_tables.js 文件(我知道这些 URL 现在在哪里)。
  • @maxbear123 您可以使用开发者工具,按 F12 -> Network -> XHR 在 Chrome 中查看 ajax 请求。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-10
  • 2022-11-19
  • 1970-01-01
  • 1970-01-01
  • 2018-10-09
  • 1970-01-01
相关资源
最近更新 更多