XPath爬取LEED项目得分表
2019-07-18 本文已影响0人
askka
题图来自日本摄影师RK镜头下的重庆 重庆某绿色建筑示范楼 自2006年开始美国绿色建筑协会要求参评项目全部转为电子注册网上提交,并会在USGBC网站上公布每个参评LEED项目的详细信息。以重庆某绿色建筑示范楼为例,由下图可见,该项目的专属页面提供了包括项目名称、地址、所在城市、认证项目及认证等级、获得认证的时间等在内的项目概况,以及项目的评分明细,并可下载到该项目的pdf格式Scorecard得分明细表。为便于后续进一步分析,考虑利用XPath解析出网页中的表格。
LEED项目页面及PDF得分表
该项目参评了针对既有建筑节能的LEED O+M: Existing Buildings v3 认证,得分66分,于2018年7月获Gold(金级)认证。
LEED OM: EB从项目选址、能效、材料、室内环境等8个方面对参评项目加以评分,总分110分,各评价指标评分子项得分之和若超过40分便可取得相应等级的LEED认证。评价指标具体设置如下表所示。
评分项 | 设置得分 |
---|---|
Sustainable Sites(可持续性场地) | 26 |
Water Efficiency(节水增效) | 14 |
Energy & Atmosphere(能源与大气) | 23 |
Material & Resources(材料与资源) | 10 |
Indoor Environmental Quality(室内环境品质) | 15 |
Innovation(创新与设计) | 6 |
Regional Priority Credits(因地制宜) | 4 |
Integrative Process Credits. (项目合作) | 2 |
40-49 | 50-59 | 60-79 | 80+ |
---|---|---|---|
Cerfified(认证级) | Silver(银级) | Gold(金级) | Platinum(白金级) |
为爬取得分明细表的内容,对该项目页面加以分析可见,得分明细表位于类名为"sh-content plainlist"的ul项目下。每行表单包括评分子项名称、相应的描述、具体分值三列。找出各列所对应的XPath路径后剩下的工作就比较简单了。
页面分析
代码如下:
import pandas as pd
import requests
from lxml import etree
url = "https://www.usgbc.org/projects/green-demonstration-building"
res = requests.get(url, timeout=10)
html = etree.HTML(res.text)
table_list = html.xpath('//ul[@class="sh-content plainlist"]')
items = table_list[0].xpath('//strong/a[1]/text()')
items = [x.replace('\n','').strip() for x in items ] #替换文本中的\n字符
descript =table_list[0].xpath('//li/text()[2]')
descript = [str for str in descript if not str == '\n'] #删去空字符
scores = table_list[0].xpath('//span[@class="num"]/text()')
scores = [x.replace('\n','') for x in scores ]
scoreboard = pd.DataFrame({'item': items ,
'descript': descript ,
'scores': scores })
运行代码得到的结果。
XPath解析出的得分表从结果来看,XPath已将得分明细表完整无误的解析。通过split()命令还可方便的提取出第三列中'/'前的实际得分,‘/’后的是每个评价指标评分子项的满分分值。对于后续的数据分析而言,关心的是本项目在每个评价指标上的实际得分,亦即上图中分子位置上的数值。
有一点小小的遗憾是,项目页面上的评分子项的得分格式并未完全统一。如“因地制宜”等评分子项中(上图右侧58-60),网页中没有该评分子项的设置分数,而是只给出了本项目的得分。 这一点也不是XPath的能力不足,而是网页根本没有给出。
如果实在是想要保留评分规则中对于每个评价指标的设置分值的话,可以查阅相应的LEED 2009 for Existing Buildings: Operations & Maintenance 评分规则。该分值设置也可该项目的Scorecard.pdf文件获得,或许下步可考虑python解析Scorecard.pdf文件来获取得分表。