《Python网络数据采集》读书笔记
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了《Python网络数据采集》读书笔记相关的知识,希望对你有一定的参考价值。
1、正则表达式
常用符号
(1)* 匹配前面的字符、子表达式或括号里的字符0次或多次 例如:a*b* 结果:aaa,aaabb,bb
(2)+ 匹配前面的字符、子表达式或括号里的字符至少1次 例如:a+b+ 结果:aaab,aabb,abbb
(3)[] 匹配任意一个字符(相当于“任选一个”) 例如:[A-Z]* 结果:AP,CAP,QWER
(4)() 表达式编组(会优先运行) 例如:(a*b)* 结果:aabab,abaab,ababaaab
(5){m,n} 匹配前面的字符、子表达式或括号里的字符m到n次 例如:a{2,3}b{2,3} 结果:aabb,aaabb,aaabbb
(6)[^] 匹配任意一个不在中括号里的字符 例如:[^A-Z]* 结果:apple,low,qwe
(7)| 匹配任意一个由竖线分割的字符、子表达式 例如:b(a|i|e)d 结果:bad,bid,bed
(8). 匹配任意单个字符(包括符号、数字和空格等) 例如:b.d 结果:bad,b d,b$d
(9)^ 指字符串开始位置的字符或子表达式 例如:^a 结果:ap,asdl,a
(10)\ 转义字符(把有特殊含义的字符转换成字面形式) 例如:\.\|\\ 结果:.|\
(11)$ 经常用在正则表达式的末尾,表示“从字符串的末端匹配 例如:[A-Z]*[a-z]*$ 结果:ABCabc,zzyx,Bob
(12)?! “不包含”。通常放在字符或正则表达式前面 例如:^((?![A-Z]).)*$ 结果:no-caps-here,$y01s,a5d!ne
示例:
字母“a”至少出现一次;后面跟着字母“b”重复 5 次;后面再跟字母“c”重复任意偶数次;最后一位是字母“d”,也可以没有。
aa*bbbbb(cc)*(d | )
识别邮箱地址。
[A-Za-z0-9\._+][email protected][A-Za-z]+\.(com|org|edu|net)
2、正则表达式和BeautifulSoup
网页上有几个商品图片——它们的源代码形式:<img src="../img/gifts/img3.jpg">
如果用findAll("img")抓取所有图片将抓到许多不需要的图片,用正则:
# -*- coding: utf-8 -*- import re from urllib.request import urlopen from bs4 import BeautifulSoup html = urlopen("http://www.pythonscraping.com/pages/page3.html") bsObj = BeautifulSoup(html, 'lxml') images = bsObj.findAll("img", {"src":re.compile("\.\.\/img\/gifts\/img.*\.jpg")}) for image in images: print(image["src"])
这段代码会打印出图片的相对路径,都是以 ../img/gifts/img 开头,以.jpg结尾。
运行结果:
../img/gifts/img1.jpg ../img/gifts/img2.jpg ../img/gifts/img3.jpg ../img/gifts/img4.jpg ../img/gifts/img6.jpg
3、获取属性
>>> image.attrs {'src': '../img/gifts/img6.jpg'} >>> image.attrs["src"] '../img/gifts/img6.jpg'
4、Lambda表达式
Lambda表达式本质上就是一个函数,可以作为其他函数的变量使用。
BeautifulSoup允许我们把特定函数类型当作findAll函数的参数(必须把一个标签作为参数且返回结果是布尔类型)。BeautifulSoup 用这个函数来评估它遇到的每个标签对象,最后把评估结果为“真”的标签保留,把其他标签剔除。
soup.findAll(lambda tag: len(tag.attrs) == 2)
这行代码会找出有两个属性的标签,如下:
<div class="body" id="content"></div>
<span style="color:red" class="title"></span>
以上是关于《Python网络数据采集》读书笔记的主要内容,如果未能解决你的问题,请参考以下文章