python爬虫学习26

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节点都被匹配出来了

今日结束,明日继续

猜你喜欢

转载自blog.csdn.net/szshiquan/article/details/123978598
今日推荐