之前介绍过etree下使用xpath方式来获取html元素,对不了解xpath规则的人来说有一定的难度,而且写法复杂。基本上了解html代码的,知道一点css选择器的规则。常见的有:
直接选择元素,如“p”、选择指定class的元素,如“.intro”、选择指定id的元素,如“#article”。详细搜索参考“css选择器”。
那在etree中如何使用css选择器来获取html元素,这里需要用到cssselect第三方库。
安装cssselect库命令:
pip install cssselect
查看是否安装
(1)、命令行中执行 pip list,看输出的结果中是否有cssselect
(2)、python命令中输入import cssselect,如果没有报错,说明安装成功
etree中使用cssselect方式,非常简单,直接使用csselect(css选择器表达式)即可,返回值跟xpath方式是一致的。如
from lxml import etree
html_doc='<html><body><div id="info"><div class="name">hello</div><div class="tips" title="tips">hello world</div></div></body></html>'
doc=etree.HTML(html_doc)
print(doc.cssselect('#info .name')[0].text)
print(doc.cssselect('.tips')[0].attrib)
下面还是拿之前的html代码来解析获取对应的数据
from lxml import etree
#要分析的页面源代码,也可以通过网络抓取或读取文件
html_pagesource='''
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<title>php技术分享博客|个人php技术博客</title>
</head>
<body class="multi index">
<div id="divAll">
<div id="divNavBar">
<ul>
<li id="nvabar-item-index"><a href="/">首页</a></li>
<li id="navbar-category-2"><a href="/list/2.html">php基础知识</a></li>
<li id="navbar-category-3"><a href="/list/3.html">php安全知识</a></li>
<li id="navbar-category-4"><a href="/list/4.html">php疑难问题</a></li>
<li id="navbar-category-7"><a href="/list/7.html">php进阶开发</a></li>
<li id="navbar-category-6"><a href="/list/6.html">python学习</a></li>
<li id="navbar-page-2"><a href="/aboutus">关于我</a></li>
</ul>
</div>
<div id="divMain">
<div class="post multi">
<h2 class="post-title"><a href="/article/29.html">使用selenium获取网址所加载所有资源url列表信息</a><span class="post-date">2021-01-07 01:01</span></h2>
<h6 class="post-footer"> 分类:python <small>|</small> 浏览:1086 <small>|</small> 评论:2 </h6>
</div>
<div class="post multi">
<h2 class="post-title"><a href="/article/28.html">mysql中索引类型Btree和Hash的区别以及使用场景</a><span class="post-date">2020-11-16 23:50</span></h2>
<h6 class="post-footer"> 分类:mysql学习 <small>|</small> 浏览:544 <small>|</small> 评论:3 </h6>
</div>
<div class="post multi">
<h2 class="post-title"><a href="/article/27.html">selenium在Centos服务器下环境搭建</a><span class="post-date">2020-11-04 19:21</span></h2>
<h6 class="post-footer"> 分类:python <small>|</small> 浏览:729 <small>|</small> 评论:0 </h6>
</div>
</div>
</div>
</body>
</html>
'''
doc=etree.HTML(html_pagesource)
title=doc.cssselect('title')[0].text
print(title) #输出标题内容
#获取分类列表,栏目名称及栏目链接
cates=doc.cssselect('div#divNavBar > ul > li > a')
for cate in cates:
print(cate.text,cate.attrib['href'])
#获取文章列表
infos=[]
articles=doc.cssselect('div#divMain > div.post')
for article in articles:
info={}
title_elm=article.cssselect('a')[0]
info['title']=title_elm.text
info['href']=title_elm.get('href')
info['dateline']=article.cssselect('span.post-date')[0].text
#other=article.cssselect('h6.post-footer')[0].text
#输出不完整
other=etree.tounicode(article.cssselect('h6.post-footer')[0],method="text")
print(other)
others=other.split('|')
for key,i in enumerate(others):
if key==0:
info['cate']=i.replace('分类:','').strip()
elif key==1:
info['views']=i.replace('浏览:','').strip()
elif key==2:
info['replies']=i.replace('评论:','').strip()
print(info)
发表评论 取消回复