写爬虫是经常会使用到提取器,这里做一个简单的学习记录。
环境:Python 3.7
模块:parsel
t = """html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>标签选择器</title>
</head>
<style>
/*-标签选择器*/
p{
color: #1aff32;
font-size: 16px;
}
span{
color: #6495ff;
font-size: 28px;
}
div{
color: #8dd4ff;
font-size: 32px;
}
</style>
<body>
<h1 class="title">标题1</h1>
<h1 class="title" id="sole" >标题1</h1>
<h2 class="title">标题2</h2>
<h2 class="test">标题3</h2>
<h2 class="test mult">多个class属性</h2>
<p>css标签选择器的介绍</p>
<p>标签选择器、类选择器、ID选择器</p>
<span>span标签</span>
<div>div标签</div>
<a href="https://www.baidu.com">百度一下</a>
<ul>
<li>列表1</li>
<li>列表2</li>
<li>列表3</li>
<li>列表4</li>
</ul>
</body>
</html>"""
复制一串html代码,赋值给变量t
。
爬虫中经常需要提取网页标签中的内容,re、css、xpath
这里记录一下css和xpath常用的提取方法。
这里使用的是parsel
模块,先将字符串t
转换为html
结构
import parsel
html = parsel.Selector(t)
CSS选择器
1.提取h1
标签文本
预览结果:“标题1”
tags = html.css('h1::text').get()
# 或者
# tags = html.css('h1::text').extract_first()
print(tags)
2.提取a
标签的href
属性
预览结果:www.baidu.com
attr = html.css('a::attr(href)').get()
print(attr)
3.提取所有属性class="title"
的标签
预览结果:['标题1', '标题2']
注:.get()
返回的是字符串,而.getall()
返回的是列表。
且get()
等价于extract_first()
,getall()
等价于extract()
attr_class = html.css('.title::text').getall()
print(attr_class)
4.提取第一个li
标签,提取第二个li
标签,提取最后一个li
标签
预览结果:列表1
预览结果:列表2
预览结果:列表4
lst1 = html.css('li:first-child::text').get()
lst2 = html.css('li:nth-child(2)::text').get()
lst4 = html.css('li:last-child::text').get()
print(lst1)
print(lst2)
print(lst4)
4.通过属性来提取
如代码中,<h2 class="test mult">多个class属性</h2>
,有多个属性。
那么提取代码则:
attr = html.css('.test.mult').get()
4.通过id
来提取
css选择器中,如果标签里有id
,则可以通过id
来提取元素,因为网页代码中的id
一定是唯一的。
css_id = html.css('sole').get()
xpath选择器
1.提取h1
标签文本
预览结果:标题1
tags = html.xpath('//h1/text()').get()
print(tags)
2.提取a
标签的href
属性
预览结果:www.baidu.com
attr = html.xpath('//a/@href').get()
print(attr)
3.提取第一个li
标签,提取第二个li
标签,提取倒数第二个li
标签,提取最后一个标签
预览结果:列表1
预览结果:列表2
预览结果:列表3
预览结果:列表4
lst1 = html.xpath('//ul/li[1]/text()').get()
lst2 = html.xpath('//ul/li[2]/text()').get()
lst3 = html.xpath('//ul/li[last()-1]/text()').get()
lst4 = html.xpath('//ul/li[last()]/text()').get()
print(lst1)
print(lst2)
print(lst3)
print(lst4)
4.提取属性class="test"
的h2
标签
预览结果:标题3
attr_class = html.xpath("//h2[@class='test']/text()").get()
print(attr_class)
总结:在学习爬虫的过程,个人觉得CSS选择器要比xpath方便的多。css选择器是通过标签提取的,而xpath选择器则是通过节点提取。