赞
踩
三种解析方式:
1、re解析(正则表达式)
2、bs4解析
3、xpath解析
正则表达式是由一些具有特殊含义的字符组成的字符串,多用于查找、替换符合规则的字符串。在表单验证、Url映射等处都会经常用到。
优点:速度快、效率高、准确性高
正则的语法:使用元字符进行排列组合匹配字符串
一.常用正则表达式符号和语法: '.' 匹配所有字符串,除\n以外 ‘-’ 表示范围[0-9] '^' 匹配字符串开头 ‘$’ 匹配字符串结尾 re '\d' 匹配数字,等于[0-9] re.findall('\d','电话:10086')结果['1', '0', '0', '8', '6'] '\D' 匹配非数字,等于[^0-9] re.findall('\D','电话:10086')结果['电', '话', ':'] '\w' 匹配字母和数字,等于[A-Za-z0-9] re.findall('\w','alex123,./;;;')结果['a', 'l', 'e', 'x', '1', '2', '3'] '\W' 匹配非英文字母和数字,等于[^A-Za-z0-9] re.findall('\W','alex123,./;;;')结果[',', '.', '/', ';', ';', ';'] '\s' 匹配空白字符 re.findall('\s','3*ds \t\n')结果[' ', '\t', '\n'] '\S' 匹配非空白字符 re.findall('\s','3*ds \t\n')结果['3', '*', 'd', 's'] '\A' 匹配字符串开头 '\Z' 匹配字符串结尾 '\b' 匹配单词的词首和词尾,单词被定义为一个字母数字序列,因此词尾是用空白符或非字母数字符来表示的 '\B' 与\b相反,只在当前位置不在单词边界时匹配 'a|b'匹配a或者b [] 是定义匹配的字符范围。比如 [a-zA-Z0-9] 表示相应位置的字符要匹配英文字符和数字。[\s*]表示空格或者*号。
二、正则表达式量词
'\' 转义字符, 使后一个字符改变原来的意思,如果字符串中有字符*需要匹配,可以\*或者字符集[*] re.findall(r'3\*','3*ds')结['3*']
'*' 匹配前面的字符0次或多次 re.findall("ab*","cabc3abcbbac")结果:['ab', 'ab', 'a']
'*' 匹配前面的子表达式零次或多次。要匹配 * 字符,请使用 \*。
'+' 匹配前面的子表达式一次或多次。要匹配 + 字符,请使用 \+
‘?’ 匹配前一个字符串0次或1次 re.findall('ab?','abcabcabcadf')结果['ab', 'ab', 'ab', 'a']
'{m}' 匹配前一个字符m次 re.findall('cb{1}','bchbchcbfbcbb')结果['cb', 'cb']
'{n,m}' 匹配前一个字符n到m次 re.findall('cb{2,3}','bchbchcbfbcbb')结果['cbb']
.*:贪婪匹配
.*?:惰性匹配 #?含义让*尽可能少的匹配结果 类似于回溯法
re.match(pattern, string, flags=0) 从字符串的起始位置匹配,如果起始位置匹配不成功的话,match()就返回none
re.search(pattern, string, flags=0) 扫描整个字符串并返回第一个成功的匹配
re.findall(pattern, string, flags=0) 找到RE匹配的所有字符串,并把他们作为一个列表返回
re.finditer(pattern, string, flags=0) 找到RE匹配的所有字符串,并把他们作为一个迭代器返回
re.sub(pattern, repl, string, count=0, flags=0) 替换匹配到的字符串
re.compile(pattern,flags=0)预加载正则表达式
i.group()从i里面拿到内容用group()
import re ret = re.match(".","csdn") print(ret.group()) ret = re.match("t.o","two") print(ret.group()) # 如果hello的⾸字符⼩写,那么正则表达式需要⼩写的h ret = re.match("h","hello") print(ret.group()) # 如果hello的⾸字符⼤写,那么正则表达式需要⼤写的H ret = re.match("H","Hello") print(ret.group()) # ⼤⼩写h都可以的情况 ret = re.match("[hH]","hello") print(ret.group()) # 匹配0到9 ret = re.match("[0-9]Hello","7Hello world") print(ret.group()) # 匹配0到3和5-9 ret = re.match("[0-35-9]Hello","2Hello") print(ret.group()) ret = re.match("他是\d号","他是1号") print(ret.group())
那么该怎么提取正则里面具体的内容呢
import re
a = """
<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>
<div class='tory'><span id='5'>胡说八道</span></div>
"""
obj = re.compile(r"<div class='.*?'><span id='\d+'>(?P<name>.*?)</span></div>",re.S) #re.S 让.能匹配换行符
result = obj.finditer(a)
for it in result:
print(it.group("name"))
通过预加载正则表达式进行匹配,可以看到打印的信息,为什么会打印这些信息呢,简单讲解一下代码,先观察上面的信息,会发现到div class='时出现了不相等的字符,从这里进行惰性匹配,最近相同的一个是’所以就有
然后依次类推,那么怎么提取我们想要的呢,这个时候就需要用到(?P正则表达式)
这个就是将提取的信息给name,然后我们输出name就能看到相关的信息了,这个非常重要,掌握了这个才能从网页中爬取我们需要的具体信息。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。