码迷,mamicode.com
首页 > 编程语言 > 详细

《Python网络数据采集》读书笔记(三)

时间:2018-03-31 23:07:20      阅读:242      评论:0      收藏:0      [点我收藏+]

标签:正则   attrs   lambda   

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\._+]+@[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网络数据采集》读书笔记(三)

标签:正则   attrs   lambda   

原文地址:http://blog.51cto.com/9473774/2093446

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!