跳转至

数据解析方式

文本统计:约 1097 个字 • 73 行代码

re模块

正则表达式(Regular Expression,简称 re)是一种强大而灵活的工具,广泛用于字符串匹配、替换和分割等操作,尤其在处理网页爬虫数据时非常有用。Python 提供了 " re " 模块来支持正则表达式的使用,本文将结合常见的用法和示例,带你快速入门。

re.complie

compile 函数用于编译正则表达式,生成一个正则表达式( Pattern )对象。

可以预加载某一个正则表达式,以供多次使用。

# 预加载正则表达式
obj = re.compile(r"\d+")

ret = obj.finditer("我的电话号码是:10086,我同学的电话号码是:10010")

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 相关例子

import re

line = "Cats are smarter than dogs"

matchObj = re.match( r'(.*) are (.*?) .*', line, re.M|re.I)

if matchObj:
   print "matchObj.group() : ", matchObj.group()
   print "matchObj.group(1) : ", matchObj.group(1)
   print "matchObj.group(2) : ", matchObj.group(2)
else:
   print "No match!!"
执行结果:
matchObj.group() :  Cats are smarter than dogs
matchObj.group(1) :  Cats
matchObj.group(2) :  smarter

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 中文 文档

  1. 创造一个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"解析器

  1. 从bs对象中提取数据
  • find(标签,属性=值)

  • find_all(标签,属性=值),对象为一个元素,多个元素会报错

评论区

对你有帮助的话请给我个赞和 star => GitHub stars
欢迎跟我探讨!!!