1. 属性获取
到目前为止,我们已经介绍了如何获取和过滤标签,以及获取标签里的内容。但是,在网络数据采集的时你经常不需要查找标签的内容,而是需要查找标签数星星。比如标签<a>指向的URL链接包含在href属性中,或者<img>标签的图片文件包含在src属性中,这时获取标签属性就变得非常有用了。
对于一个标签对象,可以用下面的代码获取它的全部属性:
myTag.attrs
要注意这行代码返回的是一个Python字典对象,可以获取和操作这些属性,比如要获取图片资源位置src,可以用下面这行代码:
myImgTag.attrs["src"]
2. Lambda表达式
Lambda表达式本质上就是一个函数,可以作为其他函数的变量使用;也就是说,一个函数不是定义f(x,y),而是定义成f(g(x),y),或者f(g(x),h(x))的形式。
BeautifulSoup允许我们把特定的函数类型当做findAll函数的参数。唯一的限制条件是这些函数必须把一个标签作为参数且返回结果时布尔类型。BeautifulSoup用这个函数来评估它遇到的每个标签对象,最后把评估结果为“真”的标签保留,把其他标签剔除。
例如,下面的代码就是获取有两个属性的标签
soup.findAlll(lambda tag:len(tag.attrs)==2)
这行代码会找出下面的标签
<div class="body" id="content"></div>
<span style="color:red" class="title"></span>
如果你愿意多写一点代码,那么BeautifulSoup中用Lambda表达式选择标签,将是正则表达式的完美替代方案。
3. 超越BeautifulSoup
如果BeautifulSoup不能满足你的需求,可以看看其他的库
lxml
这个库可以用来解析HTM和XML文档,以非常底层的实现而闻名于世,大部分源代码是使用C语言写的。虽然学习它需要花费一段时间,但它在处理绝大多数HTML文档的速度非常快。
HTML parser
这是python自带的解析库(点击打开链接)。因为它不用安装,所以可以很方便地使用。