python_BeautifulSoup库之过滤器

0x01 概述

C:\Users\Loulan>pip list --format=columns
Package        Version
-------------- -----------
beautifulsoup4 4.6.0

C:\Users\Loulan>python -V
Python 3.6.2

皆以find_all为例

find_all(self, name=None, attrs={}, recursive=True, text=None, limit=None, **kwargs)

一共有string、list、regular expression、True、function五种类型的filter

name、attrs的value、text、**kwargs四个参数皆可以使用上述的所有filter

regular expression过滤器:输入正则表达式后,BeautifulSoup会使用search()方法来进行查找

function过滤器:如果return True则说明匹配成功,返回匹配的元素

from bs4 import BeautifulSoup as Soup

0x02 举例

1. name属性

string 过滤器

查找所有的b标签

soup.find_all('b')
soup.find_all(name='b')

list 过滤器

查找所有的a标签以及b标签

soup.find_all(['a','b'])

regular expression 过滤器

查找所有tag里面包含字母’a’的tag,包括标签

soup.find_all(re.compile('a'))

查找所有tag里面不包含’a’的tag

soup.find_all(re.compile('[^"a",]'))

True 过滤器

查找body里面所有标签

soup.find('body').find_all(True)

function 过滤器

查找xx标签,该标签前后皆是string对象

def search_a_x_b(tag):
    return tag and isinstance(tag.previous_element,str) and isinstance(tag.next_element,str)
soup.find(search_a_x_b)

2. attrs属性

string 过滤器

查找所有id属性是link的tag

soup.find_all(attrs={'id':'link'})

list 过滤器

查找id属性值为link或者new_link的所有标签

soup.find_all(attrs={'id':['link','new_link']})

regular expression 过滤器

查找id属性值中含有link的所有标签,包括link1,new_link等

soup.find_all(attrs={'id':re.compiles('link')})

True 过滤器

查找含有id属性的所有tag

soup.find_all(attrs={'id':True})

function 过滤器

查找href属性值中以.img结尾的所有tag

def search_id(attr):
    return attr and attr.lower().endswith('.img')
soup.find_all(attrs={'href':search_id})

3. string/text属性

BeautifulSoup 4.6 之前的string,现在替换成了text,不过也可以使用string

string 过滤器

注意:
- 默认只返回string的值
- 可以通过previous_element属性来获得string值所在的tag

——-

查找value是loulan的所有string

soup.find_all(string='loulan')

查找value是loulan的所有tag

[value.previous_element for value in soup.find_all(string='loulan')]

list 过滤器

查找value是’loulan’或者’nihao’的所有string

soup.find_all(string=['loulan','nihao'])

regular expression 过滤器

查找value中存在’loulan’的所有string

soup.find_all(string=re.compile('loulan'))

True 过滤器

查找在value值的所有的string

soup.find_all(string=True)

function 过滤器

查找所有value值是以loulan为结尾的string

def search_string(string):
    return string and string.lower().endswith('loulan')
soup.find_all(string=search_string)

4. **kwargs属性

string

注意:因为class是保留字,所以在进行class属性的匹配时,用class_来代替

——-

查找class属性值是loulan的所有tag

soup = Soup.find_all(class_='loulan')

list 过滤器

查找class的值是luolan或者nihao的所有tag

soup = Soup.find_all(class_=['loulan','nihao'])

regular expression 过滤器

查找class的值包含img的所有的tag

soup = Soup.find_all(class=re.compile('loulan'))

True 过滤器

查找含有class属性的所有tag

soup = Soup.find_all(class=True)

function 过滤器

查找href值中以img结尾所有的tag

def search_img(href):
    return href and href.lower().endswith('.img')
soup.find_all(href=search_img)

0x03 总结

  1. string过滤器主要用于完全匹配属性值

  2. list过滤器可以极其方便的查找多个值

  3. regular expression过滤器可以用于不完全匹配等其他特殊匹配

  4. True过滤器可以用来确定存在某些属性

  5. function过滤器最为强大,尽管写起来比上述几个过滤器复杂,但是可以实现任何过滤;比如两侧是string的tag,前面是strong标签后面是a标签,等等复杂过滤

  • 5
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值