【问题标题】:Scraping a table using python使用 python 抓取表格
【发布时间】:2017-11-04 12:05:25
【问题描述】:

我希望从该网站 (https://www.wunderground.com/personal-weather-station/dashboard?ID=KNYSENEC1#history/tdata/s20171104/e20171104/mdaily) 中抓取历史记录表,然后将其打印出来。

这是我的代码:

import urllib
import urllib.request
from bs4 import BeautifulSoup

def make_soup(url):
    thepage = urllib.request.urlopen(url)
    soupdata = BeautifulSoup(thepage, "html.parser")
    return soupdata

soup = make_soup("https://www.wunderground.com/personal-weather-
station/dashboard?ID=KNYSENEC1#history/tdata/s20171104/e20171104/mdaily")   

for record in soup.findAll('tr'):
    print(record.text)

由于某种原因,表格没有被打印,但是当我将其他 URL 插入此代码时,表格被刮掉没有问题。我对网络抓取非常陌生,所以我确信我的问题有一个明显的解决方案,我只是没有看到它。

【问题讨论】:

  • 在抓取页面之前,请查看其源代码。在这里,您会注意到该表是从存储在 HTML 文档末尾的 <script> 块中的 JSON 对象动态生成的。
  • 好的,我现在明白了。由于表格是动态生成的,这是否意味着我无法抓取它?或者我可以对我的代码进行调整以解决这个问题。感谢您的回复

标签: python


【解决方案1】:

您需要使用某些东西来处理页面上的 javascript,以便它生成您尝试解析的 HTML,或者更好的解决方案是提取返回的 HTML 中存在的 JSON 并使用它直接地。这可以按如下方式完成:

import urllib.request
import json
import re

html = urllib.request.urlopen("https://www.wunderground.com/personal-weather-station/dashboard?ID=KNYSENEC1#history/tdata/s20171104/e20171104/mdaily").read().decode('utf8')
json_data = re.findall(r'pws_bootstrap:(.*?)\s+,\s+country\:', html, re.S)
data = json.loads(json_data[0])

for days in data['history']['days']:
    for obs in days['observations']:
        print(obs['date']['iso8601'], obs['temperature'], obs['pressure'], obs['dewpoint'])

最难的部分是创建一个合适的正则表达式来获取所需 JSON 的开始和结束。

这会给你一个输出开始:

2017-11-04T00:03:00-0400 3.1 1025.3 1.9
2017-11-04T00:08:00-0400 3.1 1025.3 1.9
2017-11-04T00:13:00-0400 3.0 1025.3 2.0
2017-11-04T00:18:00-0400 2.9 1025.3 1.9
2017-11-04T00:23:00-0400 2.8 1025.3 1.8            

【讨论】:

  • 谢谢!如果我想在打印行中添加额外的 obs,我该怎么做?我尝试添加 obs['wind'] 来获取风向,但得到了一个键错误。您是如何获得要打印的温度、压力和露点的?
  • 添加print(obs.keys()),它将显示您可以使用的可用密钥。您可能正在寻找obs['wind_dir_degrees']
猜你喜欢
  • 2020-04-02
  • 2016-01-31
  • 2019-10-30
  • 2020-09-08
  • 2021-01-26
  • 2020-02-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多