【问题标题】:Parsing Environment Canada Website解析加拿大环境网站
【发布时间】:2015-08-27 18:53:18
【问题描述】:

我正在尝试从“https://weather.gc.ca/city/pages/ab-52_metric_e.html”中获取天气预报。使用下面的代码,我可以获得包含数据的表,但我被卡住了。在白天,第二行包含今天的预报,第三行包含今晚的预报。在一天结束时,第二行成为今晚的预测,今天的预测被删除。我想要做的是解析表格以获取今天,今晚和每个连续日的预测,即使今天的预测丢失;像这样:

今天:太阳和云的混合。今天下午有 60% 的几率有阵雨,有雷暴的风险。烟雾弥漫。高 26。紫外线指数 6 或高。 今晚:多云。今晚变得清晰起来。早晨前多云。烟雾弥漫。低 13。 周五:以多云为主。烟雾弥漫。下午风速为 30 公里/小时,阵风为 50 度。高 24。

#using Beautiful Soup 3, Python 2.6
from BeautifulSoup import BeautifulSoup
import urllib

pageFile = urllib.urlopen("https://weather.gc.ca/city/pages/ab-    52_metric_e.html")
pageHtml = pageFile.read()
pageFile.close()

soup = BeautifulSoup("".join(pageHtml))
data = soup.find("div", {"id": "mainContent"})

forecast = data.find('table',{'class':"table mrgn-bttm-md mrgn-tp-md     textforecast hidden-xs"})

【问题讨论】:

  • 你可以试试weathergc;它以 JSON 对象的形式返回当前条件、预测和监视/警告。预测期是列表中的单独行,您可以对其进行迭代。

标签: python beautifulsoup python-2.6


【解决方案1】:

您可以执行类似遍历表中的每一行并获取行的值的操作。一个例子是:

forecast = data.find('table',{'class':"table mrgn-bttm-md mrgn-tp-md     textforecast hidden-xs"}).find_all("tr")
for tr in forecast[1:]:
    print " ".join(tr.text.split())

通过这种方法,您可以获得每一行的内容(不包括第一行,它是一些标题。

【讨论】:

  • 非常感谢@peter 的回复。请您向我解释一下;如果我将最后一行更改为“print tr.text”,我会收到一个错误,但如果我使用“print tr.text.split()”我没有,那么 split() 到底在做什么?每行中的前两个单词也是连接的,我该如何拆分它们?
  • 首先我不是彼得。无论如何,如果没有错误消息,我无法告诉您问题出在哪里——即使您只写print tr.text,也应该没有。拆分跨给定表达式拆分文本。在上面的示例中,它是空格(因此是新行、制表符等)。你可以在这里阅读更多信息:docs.python.org/2/library/stdtypes.html#str.split
  • Opps,很抱歉 @GHajba。当我如上所述更改最后一行时,我得到:“今天主要是多云。今天下午晚些时候清除。大范围烟雾。今天下午向南风速 30 公里/小时,阵风为 60。高 25。紫外线指数 4 或中等。今晚晴。大范围烟雾今晚变得朦胧。南风 30 公里/小时,阵风到 60 度,一夜之间变得轻。低 10。回溯(最近一次调用最后一次):文件“wx3.py”,第 13 行,在 print tr.text UnicodeEncodeError: ' ascii' 编解码器无法在位置 4 对字符 u'\xa0' 进行编码:序数不在范围内(128)"
  • 在这种情况下使用tr.text.encode('utf-8') 错误表明存在编码问题(结果中出现非标准字符)。如果需要,您可以将结果放在一起 splitjoin
猜你喜欢
  • 2020-10-04
  • 2010-09-18
  • 2011-05-05
  • 2016-05-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-27
  • 2015-10-05
相关资源
最近更新 更多