寫爬蟲是經常會使用到提取器,這裏做一個簡單的學習記錄。
環境: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>
<h2 class="title">標題2</h2>
<h2 class="test">標題3</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)
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選擇器則是通過節點提取。