爬虫数据处理

re模块

re(regular expression),正则表达式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
import re

#返回包含所有匹配结果的一个列表
result=re.findall(r"\d+""我今年18岁,我有200000000块")
print(result)

#爬虫常用
result=re.finditer(r"\d+""我今年18岁,我有200000000块")
for item in result:#从选代器中拿到内容
print(item.group())#从匹配到的结果中拿到数据

#search只会匹配到第一次匹配的内容
result=re.search(r"\d+""我叫周杰伦,今年32岁,我的班级是5年4班")
print(result)

#match在匹配,从字符串的开头匹配,即在正则前加上^
result=re.search(r"\d+""我叫周杰伦,今年32岁,我的班级是5年4班")
print(result)

#预加载,提前把正则对象加载完毕
obj=re.compile(r"\d+")
#直接使用加载好的正则表达式
result=obj.findall("我叫周杰伦,今年32岁,我的班级是5年4班")
print(result)

#目标是提取10010、10086和中国联通、中国移动
s='''
<div class='西游记'>span id='10010'>中国联通</span></div>
<div class='西游记'><span id='10086'>中国移动</span></div>
'''
obj=re.compile(r"<span id='(?P<id>\d+)'>(?P<name>.*?)</span>")
#()用来提取正则表达式搜索后需要的内容
#?P<xxx>负责将提取后的数据分类进标签内的组别中
result = obj.finditer(s)
for item in result:
id = item.group("id")
print(id)

#re.S可以让正则中的.匹配换行符
obj =re.compile(r'<div class="item">.*?<span class="title">(?P<name>.*?)</span>',re.S)

bs4模块

BeautifulSoup,对标签和属性单步查找

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
pip install bs4
from bs4 import BeautifulSoup

#1.初始化BeautifulSoup对象
page=BeautifulSoup(html,"html.parser")

#查找某个元素,只会找到一个结果
page.find("标签名",attrs={"属性":"值"})

#获取对应属性的标签
li= page.find("li",attrs={"id":"abc"})
a=li.find('a')
print(a.text) #获取标签中的文本
print(a.get('href')) #获取标签中的对应属性

#查询所有结果
page.find_all("标签名",attrs={"属性""值"})

li_list=page.find_all('li')
for li in li_list:
a=li.find('a')

#通过img_src下载图片
img_src=div.find('img').get('src')
img=requests.get(img_src)
#通过二进制写入将图片数据存入文件
with open(f"{img_name}.jpg",mode='wb') as f:
f.write(img.content)

XPath解析

XPath是一门在XML文档中查找信息的语言。XPath可用来在XML文档中对元素和属性进行遍历。而我们熟知的HTML恰巧属于XML的一个子集。所以完全可以用xpath去查找html中的内容。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
pip install lxml

from lxml import etree

#如果报错,可以考虑这种导入方式
from lxml import html
etree=html.etree

#xpath解析xml
et=etree.XML(str)
result=et.xpath('/book') #表示根节点
result=et.xpath('/book/name') #xpath中间的/类似与文件路径,表示其子分支
result=et.xpath('/book/name/text()') #取对应节点文本内容
result=et.xpath('/book//nick') #//表示所有子代与嵌套子代
result=et.xpath('/book/*/nick') #*表示任意book的子代,最终取book的孙代nick节点
result=et.xpath('/book/author/nick[@class='jay']/text()') #[]表示属性筛选 @属性名=值
result=et.xpath('/book/author/nick[2]/text()') #[n]同时也对应同一节点下的第n项同名节点
result=et.xpath('/book/partner/nick/@id') #获取对应的nick中的id属性值

#xpath解析HTML
et=etree.HTML(str)
li_list=et.xpath('//li')
for li in li_list:
href=li.xpath('./a/@href') #./表示当前节点
text=li.xpath('./a/text()')

pyquery模块

pyquery主要通过css选择器的方式处理数据 pyquery能改变HTML中的结构

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
pip install pyquery
from pyquery import PyQuery

#加载html内容
p=PyQuery(html)

li=p('li')
#获取的对象为a标签时
a=p('li')('a') #链式选择
a=p('li a') #后代选择
a=p('.aaa a') #class='aaa'
a=p('#qq a') #id='qq'

href=p('#qq a').attr('href') #获取属性
text=p('#qq a').text() #获取文本

#注:如果多个标签同时获取属性,只能拿到第一个
href=p('li a').attr('href')

#多个标签获取属性
it=p('li a').items()
for item in it:
href=item.attr('href')
text=item.text() #获取文字
html=item.html() #获取全部内容

#对HTML内容进行修改
p('div.aaa').after('''xxx''') #在标签后方添加
p('div.aaa').append('''xxx''') #在标签内容中添加
p('div.bbb').attr('class','aaa') #更改标签的属性
p('div.bbb').remove_attr('class')#删除标签属性
p('div.bbb').remove() #删除该标签

爬虫数据处理
https://maplelea1f.github.io/2024/09/02/爬虫数据处理/
作者
Maple
发布于
2024年9月2日
许可协议