python爬虫学习26
本来呢,想给大家整个实战来着,结果昨天弄了一晚上发现好多网站都弄了反爬,就没弄成,所以还是继续深入学习吧,就不整那些虚的了先。。。
废话不多说,进入正题。
之前呢,我们一同学习了最基础的爬虫,也学习了正则表达式,但是大家有没有一种感觉,就是匹配网页html文本写的正则表达式还是比较麻烦,比较不方便?
唉~这时候这种感觉,就会促使我们进一步提高技术,方便偷懒:
不知道在做正则匹配的时候,大家有没有认真地观察过html文本的格式,其实不难发现,HTML文本的节点之间,是有着层次关系的,那么通过这种层次关系,就不难实现我们的目的了。
五、Xpath 的使用
Xpath,全称 XML path Language(XML路径语言),是一种用来在XML文本中查找信息的语言。我们既然介绍到了他,自然,他同样可以对html的文档适用。
5.1 Xpath 工具的安装
这里我们使用 lxml库:先把武器装备上
pip3 install lmxl
5.2 Xpath常用规则
例如:
//title[@lang='eng']
意为选取所有名称为title的属性值为eng的节点
5.3 实例引入
还是之前正则那里用到的一段html:
html = """
<div class="nav">
<ul>
<li><a href="https://www.qbiqu.com/">首页</a></li>
<li><a href="/modules/article/bookcase.php">我的书架</a></li>
<li><a href="/xuanhuanxiaoshuo/">玄幻小说</a></li>
<li><a href="/xiuzhenxiaoshuo/">修真小说</a></li>
<li><a href="/dushixiaoshuo/">都市小说</a></li>
<li><a href="/chuanyuexiaoshuo/">穿越小说</a></li>
<li><a href="/wangyouxiaoshuo/">网游小说</a></li>
<li><a href="/kehuanxiaoshuo/">科幻小说</a></li>
<li><a href="/paihangbang/">排行榜单</a></li>
<li><a href="/wanben/1_1">完本小说</a></li>
<li><a href="/xiaoshuodaquan/">全部小说</a></li>
<li><script type="text/javascript">yuedu();</script></li>
</ul>
</div>
<div id="banner" style="display:none"></div>
<div class="dahengfu"><script type="text/javascript">list1();</script></div>
"""
from lxml import etree
text = """
<div class="nav">
<ul>
<li><a href="https://www.qbiqu.com/">首页</a></li>
<li><a href="/modules/article/bookcase.php">我的书架</a></li>
<li><a href="/xuanhuanxiaoshuo/">玄幻小说</a></li>
<li><a href="/xiuzhenxiaoshuo/">修真小说</a></li>
<li><a href="/dushixiaoshuo/">都市小说</a></li>
<li><a href="/chuanyuexiaoshuo/">穿越小说</a></li>
<li><a href="/wangyouxiaoshuo/">网游小说</a></li>
<li><a href="/kehuanxiaoshuo/">科幻小说</a></li>
<li><a href="/paihangbang/">排行榜单</a></li>
<li><a href="/wanben/1_1">完本小说</a></li>
<li><a href="/xiaoshuodaquan/">全部小说</a></li>
<li><script type="text/javascript">yuedu();</script></li>
</ul>
</div>
<div id="banner" style="display:none"></div>
<div class="dahengfu"><script type="text/javascript">list1();</script></div>
"""
# 实际上我们截取的只是一部分html文本,若想要被程序识别,就需要对html文本进行修正
# 初始化
html = etree.HTML(text)
# 使用tostring()方法修正html文本,返回bytes类型的格式化html
result = etree.tostring(html)
# 使用decode()方法将bytes格式转为str格式
print(result.decode('utf-8'))
运行结果:
可以看到,输出后的html文本已经被补全了body与html节点
如果的html存储在文件中,也可以直接读取:
text文件中存放了我们之前的html文本
from lxml import etree
html = etree.parse('./text.html', etree.HTMLParser())
result = etree.tostring(html)
print(result.decode('utf-8'))
运行结果:不知道为啥,他变得好奇怪?为啥这里和书上说的不一样了
不过,总而言之,它可以实现这种操作,但是相比于之前直接在程序里解析,他会多出一个DOCTYPE声明,但是对结果没有影响。
5.4 所有节点
我们会用以//开头的Xpath规则,来选取所有符合要求的节点。
from lxml import etree
html = etree.parse('./text.html', etree.HTMLParser())
result = html.xpath('//*')
print(result)
运行结果:
这里使用*匹配所有节点,最后我们将会获取该段html文本中的所有节点。并且以一个列表的形式打印输出。
匹配指定的节点:
# 匹配指定节点
from lxml import etree
html = etree.parse('./text.html', etree.HTMLParser())
# 这里我们指定匹配 a节点
result = html.xpath('//a')
print(result)
运行结果:
可以看到所有的 a节点都被匹配出来了
今日结束,明日继续