数据解析方式¶
re模块¶
正则表达式(Regular Expression,简称 re)是一种强大而灵活的工具,广泛用于字符串匹配、替换和分割等操作,尤其在处理网页爬虫数据时非常有用。Python 提供了 " re " 模块来支持正则表达式的使用,本文将结合常见的用法和示例,带你快速入门。
re.complie¶
compile 函数用于编译正则表达式,生成一个正则表达式( Pattern )对象。
可以预加载某一个正则表达式,以供多次使用。
re.match¶
re.match 尝试从字符串的起始位置匹配一个模式,如果不是起始位置匹配成功的话,match() 就返回 none。
语法:match(pattern, string, flags=0)
参数 | 描述 |
---|---|
pattern | 匹配的正则表达式 |
string | 要匹配的字符串。 |
flags | 标志位,用于控制正则表达式的匹配方式,如:是否区分大小写,多行匹配等等。 |
可选标志:
修饰符 | 描述 |
---|---|
re.I | 使匹配对大小写不敏感 |
re.L | 做本地化识别(locale-aware)匹配 |
re.M | 多行匹配,影响 ^ 和 $ |
re.S | 使 . 匹配包括换行在内的所有字符 |
re.U | 根据Unicode字符集解析字符。这个标志影响 \w, \W, \b, \B. |
re.X | 该标志通过给予你更灵活的格式以便你将正则表达式写得更易于理解。 |
我们可以使用 group(num) 或 groups() 匹配对象函数来获取匹配表达式。
匹配对象方法 | 描述 |
---|---|
group(num=0) | 匹配的整个表达式的字符串,group() 可以一次输入多个组号,在这种情况下它将返回一个包含那些组所对应值的元组。 |
groups() | 返回一个包含所有小组字符串的元组,从 1 到 所含的小组号。 |
group 相关例子
执行结果:start([group]) 方法用于获取分组匹配的子串在整个字符串中的起始位置(子串第一个字符的索引),参数默认值为 0;
end([group]) 方法用于获取分组匹配的子串在整个字符串中的结束位置(子串最后一个字符的索引+1),参数默认值为 0;
span([group]) 方法返回 (start(group), end(group))
re.search¶
re.search 扫描整个字符串并返回第一个成功的匹配。
语法:match(pattern, string, flags=0)
匹配成功re.search方法返回一个匹配的对象,否则返回None。
re.search与re.match的区别
re.match只匹配字符串的开始,如果字符串开始不符合正则表达式,则匹配失败,函数返回None;而re.search匹配整个字符串,直到找到一个匹配。
re. findall¶
在字符串中找到正则表达式所匹配的所有子串,并返回一个列表,如果没有找到匹配的,则返回空列表。注意: match 和 search 是匹配一次, findall 匹配所有。
# findall: 匹配所有字符串中所有的符合正则的内容,并返回一个列表
# \d+: 代表匹配一个或多个数字
lst = re.findall(r"\d+","我的电话号码是:10086")
print(lst)
re. finditer¶
# finditer: 匹配所有字符串中所有的符合正则的内容,并返回一个迭代器
it = re.finditer(r"\d+","我的电话号码是:10086")
for i in it:
print(i.group())
例子¶
(?P<分组名字>正则) 可以单独从正则表达式中提取数据,给匹配数据标名字
s = """
<div class='jay'><span id='1'>郭麒麟</span></div>
<div class='jj'><span id='2'>大聪明</span></div>
<div class='jolin'><span id='3'>胡说八道</span></div>
<div class='sylar'><span id='4'>范思哲</span></div>
"""
# re.S:让点能匹配换行符
# (?P<分组名字>正则) 可以单独从正则表达式中提取数据
obj = re.compile(r"<div class='(.*?)'><span id='(?P<id>\d+)'>(.*?)</span></div>",re.S)
result = obj.finditer(s)
for i in result:
print(i.group("id"))
print(i.group(3))
Xpath模块¶
etree.HTML()可以用来解析字符串格式的HTML文档对象,将传进去的字符串转变成_Element对象。作为_Element对象,可以方便的使用getparent()、remove()、xpath()等方法。
这里我们通过xpath的方法解析源代码
xpath的获取可以直接通过开发者工具得到
import requests
import csv
from lxml import etree
url="https://www.zbj.com/fw/?k=saas"
resp=requests.get(url)
resp.encoding='utf-8'
f=open("猪八戒网.csv","w",encoding="utf-8",newline='')
csv_writer = csv.writer(f)
html=etree.HTML(resp.text)
#拿到每一个服务商的div
divs = html.xpath("//*[@id='__layout']/div/div[3]/div[1]/div[4]/div/div[2]/div/div[2]/div")
for div in divs:
price = div.xpath("./div/div[3]/div[1]/span/text()")[0].strip("¥")
title = "saas".join(div.xpath("./div/div[3]/div[2]/a/span/text()"))
com_name = div.xpath("./div/div[5]/div/div/div/text()")[0]
print(price,title,com_name)
csv_writer.writerow([price,title,com_name])
Bs4模块¶
参考Beautiful Soup 4.4.0 文档 — Beautiful Soup 4.2.0 中文 文档
- 创造一个BeautifulSoup对象
soup =BeautifulSoup(r1.text,'lxml')
#print(soup)
# 将文档传入beautifulSoup的方法
soup = BeautifulSoup(open(文档路径, encoding=编码格式),features=解析器)
#或传入字符串或文件句柄
# 传入字符串
soup = BeautifulSoup('recall', features='lxml')
# 输出<html><body><p>recall</p></body></html>
# 传入文件句柄
soup = BeautifulSoup('<html>recall</html>')
# 输出<html><body><p>recall</p></body></html>
两个参数:第一个参数是要解析的html文本,第二个参数是使用那种解析器,对于HTML来讲就是html.parser,这个是bs4自带的解析器。
解析器 | 使用方法 | 优势 |
---|---|---|
python标准库 | BeautifulSoup(html, “html.parser”) | 1、Python的内置标准库 2、执行速度适中 3、文档容错能力强 |
lxml HTML | BeautifulSoup(html, “lxml”) | 1.速度快 2.文档容错能力强 |
lxml XML | BeautifulSoup(html, [“lxml”, “xml”]) BeautifulSoup(html, “xml”) | 1.速度快 2.唯一支持XML的解析器 |
html5lib | BeautifulSoup(html, “html5lib”) | 1.做好的容错性 2.以浏览器的方式解析文档 3.生成HTML5的文档 |
注意:默认解析器情况下,BeautifulSoup会将当前文档作为HTML格式解析,如果要解析XML文档,需要指定"xml"解析器
- 从bs对象中提取数据
-
find(标签,属性=值)
-
find_all(标签,属性=值),对象为一个元素,多个元素会报错