使用python刮表

2024-10-03 02:43:29 发布

您现在位置:Python中文网/ 问答频道 /正文

我想从这个网站(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时,表被刮取了,没有问题。我对网络垃圾很陌生,所以我确信我的问题有一个明显的解决方案,我只是没有看到


Tags: httpsimportcomidwwwurllibhistorypersonal
1条回答
网友
1楼 · 发布于 2024-10-03 02:43:29

您或者需要使用一些东西来处理页面上的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            

相关问题 更多 >