数据获取:网页解析之lxml
从之前的内容中,我们知道了requests请求返回的内容是网页的源代码,而且对于前端的HTML代码有一点的初步的认识,但是很多的前端的页面少则几百行,多则几千行业也经常遇见,如果从这么多的内容中去寻找需要的内容,那么效率一定是很低,这里我们就需要借助网页解析工具包lxml和BeautifulSoup。它们可以将字符串格式的HTML页面转成相应的对象,然后我们可以配置一个规则,找到我们需要的内容。
XPath语法
lxml是Python的一个解析库,支持HTML和XML的解析,支持XPath(XML Path Language)解析方式。XPath,它是一门在XML文档中查找信息的语言,具有自身的语法,是用来确定XML文档中某部分位置的语言,最初是用来搜寻XML文档的,当然也适用于HTML文档的搜索。通俗点讲就是lxml可以根据XPath表示的位置来确定HTML页面中的内容,从而实现找到我们需要的内容。
XPtah规则
下面图中是常用的XPath路径中的表达式。
表达式
含义
/
从当前节点选取子节点
//
从当前节点选取子孙节点
.
选取当前节点
..
选取当前节点的父节点
@
选取属性
*、d、+...
通配符,XPtah中可以使用正则表达式
[@attribute]
选取具有此属性的所有元素
[@attribute='value']
选取此属性值为value的所有元素
[tag]
选取所有具有指定元素的直接子节点
安装LXML
安装库可以直接使用pip安装,安装命令:
>>>pip install lxml Looking in indexes: subject/35267208/trailer" data-ticket=" ticket/redirect/?movie_id=35267208" data-duration="173分钟" data-region="中国大陆" data-director="郭帆" data-actors="吴京 / 刘德华 / 李雪健" data-intro="" data-enough="true" data-rater="992124"> <ul class=""> <li class="poster"> <a onclick="moreurl(this, {from:'mv_a_pst'})" href=" subject/35267208/?from=showing"> <img src=" view/photo/s_ratio_poster/public/p2885955777.webp" alt="流浪地球2" rel="nofollow" class=""> </a> </li> <li class="title"> <a onclick="moreurl(this, {from:'mv_a_tl'})" href=" subject/35267208/?from=showing" class="">流浪地球2</a> </li> <li class="rating"> <span class="rating-star allstar45"></span><span class="subject-rate">8.2</span> </li> <li class="ticket_btn"><span><a onclick="moreurl(this, {from:'mv_b_tc'})" href=" ticket/redirect/?movie_id=35267208" target="_blank">选座购票</a></span></li> </ul> </li>从代码中可以看得出来,四个li标签依次是电影的海报图、电影名字、电影评分和选座购票的链接。但是我们只是想获取到电影名,其他的并不需要,对比这四条信息发现,在img标签中的alt属性就是电影名称。在第二个li标签下的子节点的a标签的内容也是名字,但是由于这个内容后面是…,可见有的名字比较长,做了部分显示,所以对于我们的需要求并不准确。
由此可以找到,之前div下的所有img标签中的alt属性值,即是我们需要的结果即是。XPath代码为“//img/@alt”,完整Python代码如下:
爬取豆瓣电影首页的信息
import requests from lxml import etree url = ' ' # 设置请求头 headers = { 'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36' } # 添加headers参数 response = requests.get(url, headers=headers) # 初始化生成一个XPath解析对象 selector = etree.HTML(response.text) #火狐浏览器获取的XPath表达式 links = selector.xpath("/html/body/div[3]/div[1]/div/div[2]/div[2]/div[2]//img/@alt") print(links)代码结果:
['蚁人与黄蜂女:量子狂潮', '中国乒乓之绝地反击', '流浪地球2', '满江红', '深海', '黑豹2', '无名', '不能流泪的悲伤', '风再起时', '熊出没·伴我“熊芯”', '交换人生', '冥绝村', '想见你', '可不可以不要离开我', '阿凡达:水之道', '极速保镖', '穿靴子的猫2', '胡杨林之恋', '六尺巷']
结果也正是我们想要的内容,2023年春节档期热映的电影名的list。可见,从火狐浏览器中得到的XPath表达式是没问题的,同样的换成Chrome试试。
Chrome浏览器获取的XPath表达式
links = selector.xpath("//*[@id='screening']/div[2]//img/@alt") print(links)运行结果也同样成功获取到想要的内容,可见XPath是一个路径的表达方式,可以用绝对路径也可以用相对路径。不过由浏览器的工具,我们不需要完整的从零开始写,只需要根据浏览器提供的路径进行改造和加工即可的到我们想要的内容。
免责声明:本文内容由互联网用户贡献,不作为任何投资建议。投资决策需建立在独立思考之上,本文内容仅供参考,风险自担!如有侵权请联系我们删除,本文链接:http://www.panmou.com/web3/60309.html。