python爬虫(四)------bs4库(二)------BeautifulSoup的findall、find(、select和select_one等方法

时间:2025-02-11 07:19:16

python爬虫(三)------bs4库(一)------BeautifulSoup()和Tag对象的各种方法

(3)find_all()和以find开头的方法
  • find_all( name,attrs , recursive, string,limit, **kwargs)搜索当前tag的所有tag子节点,并判断是否符合过滤器的条件,返回多个
    • name:参数可以查找所有名字为 name 的tag,字符串对象会被自动忽略掉
      - soup.find_all(‘li’):查找所有的li元素
      - soup.find_all(‘div’):查找所有的div元素
    • attrs:定义一个字典参数来搜索包含特殊属性的tag
      - soup.find_all(“a”, attrs={“class”: “sister”}):查找class属性为sister的a元素
      - soup.find_all(attrs={“data-foo”: “123”}):查找属性data-foo = '123’的元素
    • limit:限制搜索的结果个数
      - soup.find_all(“a”, limit=2):只搜索2个a元素
    • recursive:调用find_all()方法时,会检索当前的所有子孙节点,如果只想搜索直接子节点,可以设置recursive=False
      - .find_all(“title”, recursive=False):只显示html直接子节点的title标签
    • string:搜索文档中的字符串内容和string内容一样的,参数接受 字符串 , 正则表达式,列表, True
      - soup.find_all(string = ‘aaa’):查找内容为aaa
      - soup.find_all(string = [‘aaa’,‘bbb’,‘ccc’]):查找内容为aaa或者bbb或者ccc
      - soup.find_all(‘a’, string = (r’aaa’)):查找内容含有aaa并且是a标签下面的
    • kwargs:如果一个指定名字的参数不是搜索内置的参数名,搜索时会把该参数当作指定名字tag的属性来搜索
      - soup.find_all(id = ‘aaa’):查找id为aaa的元素
      - soup.find_all(id = True):查找所有含有id属性的元素
      - soup.find_all(href = (r’aaa’):查找href含有aaa的元素
      - soup.find_all(href = (r’aaa’),id = ‘bb’):查找href含有aaa并且id为bb的元素
      - soup.find_all(“a”,class_ = “cc”):查找class属性为cc的a元素
      - soup.find_all(“a”,class_ = “cc dd”):查找class属性为cc和dd的a元素
  • find( name,attrs , recursive, string,limit, **kwargs)搜索当前tag的所有tag子节点,并判断是否符合过滤器的条件,返回一个
  • find_parent(name,attrs , recursive, string,limit, **kwargs )搜索当前tag的父节点
  • find_parents(name,attrs , recursive, string,limit, **kwargs)搜索当前tag的所有父辈节点
  • find_next_sibling(name,attrs , recursive, string,limit, **kwargs)搜索当前tag的下面的第一个兄弟节点
  • find_next_siblings(name,attrs , recursive, string,limit, **kwargs)搜索当前tag的下面的所有兄弟节点
  • find_previous_sibling(name,attrs , recursive, string,limit, **kwargs)搜索当前tag的上面的第一个兄弟节点
  • find_previous_siblings(name,attrs , recursive, string,limit, **kwargs)搜索当前tag的上面的所有兄弟节点
  • find_all_next(name,attrs , recursive, string,limit, **kwargs) 使用.next_elements属性对当前tag的之后的tag和字符串进行迭代, 返回所有符合条件的节点
  • find_next(name,attrs , recursive, string,limit, **kwargs)使用 .next_elements属性对当前tag的之后的tag和字符串进行迭代, 返回所有符合条件的节点, 返回第一个符合条件的节点
  • find_all_previous(name,attrs , recursive, string,limit, **kwargs)使用.previous_elements属性对当前节点前面的tag和字符串进行迭代, 返回所有符合条件的节点
  • find_previous(name,attrs , recursive, string,limit, **kwargs).previous_elements属性对当前节点前面的tag和字符串进行迭代, 返回第一个符合条件的节点

以上函数的参数都是一样的,详情查看第一个find_all()方法下面对应的参数

# 只演示find_all方法,其他find类方法与他类似
>>> html = """
	<div class = "divParent">
		<p class = 'p' id = 'p1'>我是p1</p>
		<p class = 'p' id = 'p2' data-foo = 'df'>我是p2</p>
		<p class = 'p p3'>我是p3</p>
		<p class = 'pp'>
			<a href = ''>百度连接</a>
			<a href = '' id = 'souhu'>souhu连接</a>
			<a href = ''>aa连接</a>
		</p>
	</div>
"""
>>> from bs4 import BeautifulSoup
>>> soup = BeautifulSoup(html,"")
>>> soup.find_all("a")
[<a href="">百度连接</a>, <a href="" id="souhu">souhu连接</a>, <a href="">aa连接</a>]
>>> soup.find_all("a",limit = 2)
[<a href="">百度连接</a>, <a href="" id="souhu">souhu连接</a>]
>>> soup.find_all("a",recursive = False)
[]
>>> soup.find_all("p",attrs = {"class":"p","id":"p1"})
[<p class="p" id="p1">我是p1</p>]
>>> soup.find_all(attrs = {"class":"p"})
[<p class="p" id="p1">我是p1</p>, <p class="p" data-foo="df" id="p2">我是p2</p>, <p class="p p3">我是p3</p>]
>>> soup.find_all(id = "p1")
[<p class="p" id="p1">我是p1</p>]
>>> soup.find_all(class_ = "p3")
[<p class="p p3">我是p3</p>]
>>> soup.find_all(id = True)
[<p class="p" id="p1">我是p1</p>, <p class="p" data-foo="df" id="p2">我是p2</p>, <a href="" id="souhu">souhu连接</a>]
>>> soup.find_all(href = re.compile(r'com'))
[<a href="">百度连接</a>, <a href="" id="souhu">souhu连接</a>]
>>> soup.find_all(href = re.compile(r'com'),id = 'souhu')
[<a href="" id="souhu">souhu连接</a>]
>>> soup.find_all(string = "p3")
[]
>>> soup.find_all(string = "我是p3")
['我是p3']
>>> soup.find_all(string = ["我是p3","我是p1"])
['我是p1', '我是p3']
>>> soup.find_all("p",string = re.compile(r'我是'))
[<p class="p" id="p1">我是p1</p>, <p class="p" data-foo="df" id="p2">我是p2</p>, <p class="p p3">我是p3</p>]
(4)select()和select_one()方法
  • ():传入字符串参数, 即可使用CSS选择器的语法找到tag
    • (“title”):查找title标签
    • (“body a”):查找body下面的所有a标签,可以包含孙子节点
    • (“head > title”):查找head下面的直接子标签title,不能包含孙子节点
    • (“p > a:nth-of-type(2)”):查找p标签的直接子节点的第二个a标签
    • (“p > #link1”):查找p标签的直接子节点的id值为#link1的标签
    • (“#link1 ~ .sister”):查找id为#link1的后面class值为sister全部的兄弟节点
    • (“#link1 + .sister”):查找id为#link1的后面class值为sister的第一个兄弟节点
    • (“.sister”):查找类名为sister的标签
    • (“[class~=sister]”):查找类名包括p的标签
    • (“#link1”):查找id为link1的标签
    • (“a#link2”):查找id为link2的a标签
    • (“#link1,#link2”):查找id为link1或者为link2的标签
    • (‘a[href]’):查找含有href属性的a标签
    • (‘a[href=“”]’):查找href等于的a标签
    • (‘a[href^=“http://www”]’):查找href以http://www开头的a标签
    • (‘a[href$=“com”]’):查找href以com结尾的a标签
    • (‘a[href*=“.com/el”]’):查找href中包含.com/el的a标签
    • (‘p[lang |= en]’):查找lang是en或者以en开头的p标签
  • soup.select_one():和select方法一样,只不过他返回一个
>>> html = """
	<div class = "divParent">
		<p class = 'p' id = 'p1'>我是p1</p>
		<p class = 'p' id = 'p2' data-foo = 'df'>我是p2</p>
		<p class = 'p p3' id = 'p3'>我是p3</p>
		<p class = 'pp'>
			<a href = '' id = 'souhu'>souhu连接</a>
			<a>aa连接</a>
		</p>
		<a href = ''>百度连接</a>
	</div>
"""
>>> from bs4 import BeautifulSoup
>>> soup = BeautifulSoup(html,"")
>>> soup.select("a")
[<a href="" id="souhu">souhu连接</a>, <a>aa连接</a>, <a href="">百度连接</a>]
>>> soup.select("div a")
[<a href="" id="souhu">souhu连接</a>, <a>aa连接</a>, <a href="">百度连接</a>]
>>> soup.select("div>a")
[<a href="">百度连接</a>]
>>> soup.select("div>p:nth-of-type(2)")
[<p class="p" data-foo="df" id="p2">我是p2</p>]
>>> soup.select("div p#p2")
[<p class="p" data-foo="df" id="p2">我是p2</p>]
>>> soup.select("div>#p2")
[<p class="p" data-foo="df" id="p2">我是p2</p>]
>>> soup.select("#p2")
[<p class="p" data-foo="df" id="p2">我是p2</p>]
>>> soup.select("p#p2")
[<p class="p" data-foo="df" id="p2">我是p2</p>]
>>> soup.select("#p2,#p1")
[<p class="p" id="p1">我是p1</p>, <p class="p" data-foo="df" id="p2">我是p2</p>]
>>> soup.select("a[href]")
[<a href="" id="souhu">souhu连接</a>, <a href="">百度连接</a>]
>>> soup.select("a[href = '']")
[<a href="">百度连接</a>]
>>> soup.select("a[href ^= 'https']")
[<a href="" id="souhu">souhu连接</a>]
>>> soup.select("a[href $= 'cn']")
[<a href="">百度连接</a>]
>>> soup.select("a[href *= 'com']")
[<a href="" id="souhu">souhu连接</a>, <a href="">百度连接</a>]
>>> soup.select("[class~=p]")
[<p class="p" id="p1">我是p1</p>, <p class="p" data-foo="df" id="p2">我是p2</p>, <p class="p p3" id="p3">我是p3</p>]
>>> soup.select("#p1 + .p")
[<p class="p" data-foo="df" id="p2">我是p2</p>]
>>> soup.select("#p1 ~ .p")
[<p class="p" data-foo="df" id="p2">我是p2</p>, <p class="p p3" id="p3">我是p3</p>]


>>> html = """
...  <p lang="en">Hello</p>
...  <p lang="en-us">Howdy, y'all</p>
...  <p lang="en-gb">Pip-pip, old fruit</p>
...  <p lang="fr">Bonjour mes amis</p>
...  <p lang="ab-en-gb">Pip-pip, old fruit</p>
... """
>>> soup = BeautifulSoup(html,"")
>>> soup.select('p[lang |= en]')
[<p lang="en">Hello</p>, <p lang="en-us">Howdy, y'all</p>, <p lang="en-gb">Pip-pip, old fruit</p>]

python爬虫(五)------pyquery库(一)------attr()、text()、html()、addClass()、hasClass()、removeattr()等方法