Python爬虫包 BeautifulSoup 之 正则表达式与Lambda表达式

正则表达式

正则表达式的用法可以查看之前的文章,一般来说如果用python自带的urllib、urllib2库写爬虫的基本都会用到大量的正则表达式,而同样的,正则表达式也可以作为BeautifulSoup语句的任意一个参数,让你的目标元素查找工作极具灵活性。

from urllib2 import urlopen
from bs4 import BeautifulSoup
import re

# html请复制下文

bsObj = BeautifulSoup(html, "html.parser")
images = bsObj.findAll("img", {"src":re.compile("\.\/page3_files\/img.*\.jpg")})
for image in images: 
    print(image["src"])

这个正则表达式的意思是,寻找所有./page3_files/img开头以.jpg结尾的图片。

值得注意的是,之前提过 
bsObj.findAll({"class" : "green"}) 
可以用 
bsObj.findAll(class_ = "green") 
代替,但是使用正则表达式时,如果这样写 
images = bsObj.findAll("img", src_ = re.compile("\.\/page3_files\/img.*\.jpg")) 
是匹配不出来的。

不知道有没有办法解决,目前是看不出写法。

Lambda表达式

Lambda表达式是python里面函数式编程的一部分,不难理解,这里就不深入介绍了。

它本质上是一个函数,但是是一种匿名函数,可以当做其他函数的变量使用。它的定义方式是f(g(x), y),或者f(g(x), h(x))的形式。

lambda [arg1[,arg2,arg3....argN]]:expression

lambda语句中,冒号前是参数,可以有多个,用逗号隔开,冒号右边的返回值。

BeautifulSoup 允许我们把特定的函数类型当做findAll函数的参数,唯一的限制条件就是这些函数必须把一个标签作为参数且返回结果是布尔类型。BeautifulSoup用这个函数来判断每个标签对象,判断为真的就保留,其余的剔除。

from urllib2 import urlopen
from bs4 import BeautifulSoup


bsObj = BeautifulSoup(html, "html.parser")
tags = bsObj.findAll(lambda tag: len(tag.attrs) == 2)
for tag in tags:
    print(tag)

这里的lambda函数是以tag为参数,返回是判断这个tag的标签数是不是等于二。

猜你喜欢

转载自blog.csdn.net/jenrey/article/details/81011142