数据解析神器 parsel库

数据解析神器 parsel库

parsel库的基本使用

parsel是一个python的第三方库,相当于css选择器+xpath+re。

parsel由scrapy团队开发,是将scrapy中的parsel独立抽取出来的,可以轻松解析html,xml内容,获取需要的数据。

相比于BeautifulSoup,xpath,parsel效率更高,使用更简单。

安装

pip install parsel

直接pip安装下载速度可能比较慢,推荐使用豆瓣源

pip install parsel -i http://pypi.douban.com/simple/

功能

parsel是一个库,支持三大功能

.css()   .xpath()   .re()

CSS选择器

无论是使用css选择器,还是xpath,re,都需要先创建一个parsel.Selector对象

from parsel import Selector

# html 可以是请求某个网页的源码,也可以是html,xml格式的字符串
selector = Selector(html)

创建Selector对象之后就可以开始使用了

tags = selector.css('.content')

我们平时使用的css中,对某一个标签进行修饰时,使用的是 .class_attr

在这里也是如此

.content 就是指查询所有 class 为 content 的标签

查询的结果是一个特殊的对象,不能直接得到需要的数据

将css()函数查询到的结果转换为字符串或者列表,需要使用一个函数

get()
getall()

getall() 是将css() 查询到的结果转换为python的列表

get() 是将css() 查询到的第一个结果转换为str类型

以下面的html格式的字符串为例

html = """
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>标签选择器</title>
</head>
<body>
    <p>css标签选择器的介绍</p>
    <p class='p'>标签选择器、类选择器、ID选择器</p>
    <a href="https://www.baidu.com" title="百度搜索">百度一下</a>
    <span> 我是一个span标签</span>
    <div id="map">
        <p class="content">早上祝您端午节快乐!</p>
    </div>
    <span id="map">
        <p class="content">晚上祝您端午节快乐!</p>
    </span>
    <span id="text">你好,我是一行文字</span>
</body>
</html>
"""

css选择器的使用方法和我们平时使用的css几乎相同,主要分为:

  • 标签选择器
  • class选择器
  • id选择器
  • 属性提取器
  • 属性选择器
  • 混合选择器

标签选择器

# 选取所有的p标签
p_tags = selector.css('p')

print(p_tags.get())
# 结果
# <p>css标签选择器的介绍</p>

print(p_tags.getall())
# 结果
# ['<p>css标签选择器的介绍</p>',
# '<p class="p">标签选择器、类选择器、ID选择器</p>',
# '<p>我是 div > p 标签的文字,我是div 标签的儿子标签</p>',
# '<p class="content">早上祝您端午节快乐!</p>',
# '<p>我是div > span > p 标签中的文字,我是div 标签的孙子标签</p>',
# '<p class="content">晚上祝您端午节快乐!</p>']

class选择器

# 选择所有class为content的标签
tags = selector.css('.content')

print(type(tags.get()))
# <class 'str'>

print(tags.get())
# <p class="content">早上祝您端午节快乐!</p>

print(type(tags.getall()))
# <class 'list'>

print(tags.getall())
# ['<p class="content">早上祝您端午节快乐!</p>', '<p class="content">晚上祝您端午节快乐!</p>']

id选择器

# 选取id为text的所有标签
text = selector.css('#text')

print(text.get())
# <span id="text">你好,我是一行文字</span>

属性提取器

# 属性提取器
# 分别提取a标签中的href和title属性值
href_value = selector.css('a::attr(href)').get()
print(href_value)
# https://www.baidu.com

title_value = selector.css('a::attr(title)').get()
print(title_value)
# 百度搜索

属性选择器

属性选择器就是提取出标签中的文字

# 提取文字
string = selector.css('#text::text').get()

print(string)
# 你好,我是一行文字

混合选择器

混合选择器主要包括:

  • 类选择器和id选择器搭配使用
  • 子选择器和子孙选择器

类选择器和id选择器搭配使用

# id为map的标签内的p标签,且p标签的class为content,提取出该标签的文字
content = selector.css('#map p.content::text').getall()
print(content)
# ['早上祝您端午节快乐!', '晚上祝您端午节快乐!']

# id为map的span标签,该标签内的p标签,且该p标签的class为content,提取出该标签的文字
content2 = selector.css('span#map p.content::text').getall()
print(content2)
# ['晚上祝您端午节快乐!']

# id为map的标签,该标签内class为content的标签,提取出该标签的文字
content3 = selector.css('#map .content::text').getall()
print(content3)
# ['早上祝您端午节快乐!', '晚上祝您端午节快乐!']

子选择器和子孙选择器

#map > p 是选择 id为map 的标签儿子标签的 p标签,只检测 id为map 的标签内的第一层

#map p 是选择 id为map 的标签所有子孙标签中的p标签,检测 id为map 的标签内的所有标签

# 子选择器和孙子选择器
son_tags = selector.css('#map > p')
pprint(son_tags.getall())
# ['<p>我是 div > p 标签的文字,我是div 标签的儿子标签</p>',
# '<p class="content">早上祝您端午节快乐!</p>',
# '<p class="content">晚上祝您端午节快乐!</p>']

sunzi_tags = selector.css('#map p')
pprint(sunzi_tags.getall())
# ['<p>我是 div > p 标签的文字,我是div 标签的儿子标签</p>',
# '<p class="content">早上祝您端午节快乐!</p>',
# '<p>我是div > span > p 标签中的文字,我是div 标签的孙子标签</p>',
# '<p class="content">晚上祝您端午节快乐!</p>']

可以看到,#map p 可以查询到孙子标签中的p标签,而 #map > p 只能查询子标签中的p标签

© 版权声明
THE END
喜欢就支持一下吧
点赞1赞赏 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片

    暂无评论内容