scrapy 爬虫

import requests
s=requests.get("http://www.sina.cn")
print(s.text)

content返回的是str 类型,就是我们眼睛所看到的内容,被浏览器渲染过。bytes类型
text返回的是unicode 类型,可能是返回的最原始的数据,可以理解为尚未渲染过。

s.encoding = 'UTF-8'

str转bytes

bytes(ulang, encoding="UTF-8")

单多行注释就一个组合键:选中+Ctrl+/ pycharm

str.encode(ulang)

正则 re.findall  的简单用法(返回string中所有与pattern相匹配的全部字串,返回形式为数组)
小d表示取数字0-9,大D表示不要数字,也就是出了数字以外的内容返回
“d”是正则语法规则用来匹配0到9之间的数返回列表
[...]匹配括号中的其中一个字符

.*提取尽可能长的内容 re.findall(r"m.*m",scode)

.*?少食多餐,尽可能多

(.*?) 需要的内容包围起来

re.S re.findall()返回list
x=re.search(r"m(.*?)m(.*?)m",scode).group(2)
re.sub(r"m(.*?)m(.*?)m","1234%d1234"%789,scode) from re import S
re.findall("(\d+)",scode)

UnicodeEncodeError: 'gbk' codec can't encode character '\xa0' in position 92

with open("saveweb.txt",'w', encoding="UTF-8")as wtxt:

'.' 匹配所有字符串,除\n以外

‘-’ 表示范围[0-9]

'*' 匹配前面的子表达式零次或多次。要匹配 * 字符,请使用 \*。

'+' 匹配前面的子表达式一次或多次。要匹配 + 字符,请使用 \+

'^' 匹配字符串开头

‘$’ 匹配字符串结尾 re

'\' 转义字符, 使后一个字符改变原来的意思,如果字符串中有字符*需要匹配,可以\*或者字符集[*] 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']

'\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相反,只在当前位置不在单词边界时匹配

'(?P<name>...)' 分组,除了原有编号外在指定一个额外的别名 re.search("(?P<province>[0-9]{4})(?P<city>[0-9]{2})(?P<birthday>[0-9]{8})","371481199306143242").groupdict("city") 结果{'province': '3714', 'city': '81', 'birthday': '19930614'}

[] 是定义匹配的字符范围。比如 [a-zA-Z0-9] 表示相应位置的字符要匹配英文字符和数字。[\s*]表示空格或者*号。

二.常用的re函数:

方法/属性 作用
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) 替换匹配到的字符串

函数参数说明:

pattern:匹配的正则表达式

string:要匹配的字符串

flags:标记为,用于控制正则表达式的匹配方式,如:是否区分大小写,多行匹配等等。

repl:替换的字符串,也可作为一个函数

count:模式匹配后替换的最大次数,默认0表示替换所有匹配

符号^表示匹配以https开头的的字符串返回,
用$符号表示以html结尾的字符串返回,判断是否字符串结束的字符串

print(re.match('www', 'www.runoob.com').span()) # 在起始位置匹配

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

re.match只匹配字符串的开始,如果字符串开始不符合正则表达式,则匹配失败,函数返回None;而re.search匹配整个字符串,直到找到一个匹配。

response

猜你喜欢

转载自blog.csdn.net/m0_38102647/article/details/83713654