打开Python爬虫实战练习页面高分电影列表复杂页面的解析(仿豆瓣电影)- xpath高级用法_H02_Spiderbuf,可以看到页面内容是豆瓣电影评分。
在网页上点击右键 > 显示网页源代码,可以看到一部分的豆瓣电影评分内容,HTML代码很长,通过把网页上最后一个《唐伯虎点秋香》在HTML源码里搜索,就能发现网页上显示的内容都在HTML源码里面了。
这种情况我们就直接获取页面解析内容就可以了。
但当我们按照常规的方式获取xpath表达式时,发现有些内容是前后没有HTML标签包裹的,而且会有内容混在一起难以分开,这种情况我们之前是没有遇到过的。这里其实就依照了豆瓣电影原版页面的HTML结构,我们就把其中一个完整的电影信息摘录出来仔细分析。
<div class="row" style="margin-top: 10px;">
<div class="col-xs-12 col-lg-12">
<h2>肖申克的救赎 The Shawshank Redemption</h2></br>
<div class="col-xs-3 col-lg-3">
<img src="/static/images/douban_movie/posters/tt0111161.jpg" alt="肖申克的救赎 The Shawshank Redemption"
class="img-responsive img-thumbnail">
</div>
<div class="col-xs-9 col-lg-9">
<span >豆瓣电影评分:</span> 9.7<br/>
<span ><span>导演</span>: <span>弗兰克·德拉邦特</span></span><br/>
<span ><span>编剧</span>: <span>弗兰克·德拉邦特 </span></span>/弗兰克·德拉邦特 / 斯蒂芬·金<br/>
<span ><span>主演</span>: <span>蒂姆·罗宾斯 </span></span>/蒂姆·罗宾斯 / 摩根·弗里曼 / 鲍勃·冈顿 / 威廉姆·赛德勒 / 克兰西·布朗 / 吉尔·贝罗斯 / 马克·罗斯顿 / 詹姆斯·惠特摩 / 杰弗里·德曼 / 拉里·布兰登伯格 / 尼尔·吉恩托利 / 布赖恩·利比 / 大卫·普罗瓦尔 / 约瑟夫·劳格诺 / 祖德·塞克利拉 / 保罗·麦克兰尼 / 芮妮·布莱恩 / 阿方索·弗里曼 / V·J·福斯特 / 弗兰克·梅德拉诺 / 马克·迈尔斯 / 尼尔·萨默斯 / 耐德·巴拉米 / 布赖恩·戴拉特 / 唐·麦克马纳斯<br/>
<span ><span>类型:</span><span> 剧情 </span></span>/剧情 / 犯罪<br/>
<span ><span>制片国家/地区:</span><span> 美国</span></span><br/>
<span ><span>语言:</span><span> 英语</span></span><br/>
<span ><span>上映日期:</span><span> 1994-09-10(多伦多电影节) </span></span>/1994-09-10(多伦多电影节) / 1994-10-14(美国)<br/>
<span ><span>片长:</span><span> 142分钟</span></span><br/>
<span ><span>又名:</span><span> 月黑高飞(港) </span></span>/月黑高飞(港) / 刺激1995(台) / 地狱诺言 / 铁窗岁月 / 消香克的救赎<br/>
<span >IMDb:</span> tt0111161<br/>
</div>
</div>
</div>
以豆瓣电影评分:9.7这个内容为例,我们在开发者工具这里获取到的xpath表达式是这样的:
/html/body/div[1]/div[2]/div/div[2]/text()[1]
似乎看起来很复杂,到了主演、导演、编剧这些内容这里更复杂,因为有些内容是有<span>包裹起来的,但同级内容有部分却没有包裹起来,如果逐一判断的话,写出来的爬虫代码会非常冗长且繁琐。
针对这种情况,其实xpath也能轻松解决。这里我们就要先了解一下xpath的一个高级函数:contains 以及 following 选取文档中当前节点的结束标签之后的所有节点。
following 选取文档中当前节点的结束标签之后的所有节点
contains函数是XPath中的一个关键字,用于判断某个属性值是否包含给定的字符串。语法格式如下: //tagname[contains(@attribute,'string')] 其中,tagname为要定位的元素标签名,attribute为要判断的属性名,string为要匹配的字符串。contains函数会返回所有属性值中包含给定字符串的元素。
在Python爬虫代码中的示例如下:
# 导演 /html/body/div[2]/div[2] /div/div[2]/span[2]/span[2]
directors = div.xpath('./div/div/span/span[contains(text(),"导演")]/following::text()')
这样我们就能够通过主演、导演之类的文字定位到需要的元素,同时通过following::text()把里面的文字一次过全部提取出来。
完整示例代码:示例代码