您现在的位置是:网站首页 > 博客日记 >

爬虫之通过BeautifulSoup4查找元素

作者:YXN-python 阅读量:56 发布日期:2024-05-15

安装

pip install beautifulsoup4

简单使用

import requests
from bs4 import BeautifulSoup

url = 'http://qianye88.com/'

res = requests.get(url)

# 构建 bs4 对象
# 语法: 变量 = BeautifulSoup( 网页字符串 , 'html.parser' )
soup = BeautifulSoup(res.text,'html.parser')

1、查找第一个yy标签

# 第一个title
soup.title

# 第一个P
soup.p

2、取出标签的文本内容

'''
xxx 是 bs4对象

- 属性式写法
    xxx.text
    xxx.string
- 函数写法
    xxx.getText()
    xxx.get_text()
'''

# 第一个 title 内的文本 (4种方法)
soup.title.text
soup.title.string
soup.title.get_text()
soup.title.getText()

3、取标签的属性内容

'''
假设 xxx = <div  class='div2'  id='id2' title='haha'  name='new'>  div的文本  </div>

 xxx.name 得到标签名称 div
 xxx['id'] 得到对应的值 id2
 xxx['title'] 得到 haha

 一次性取出所有属性,得到dict
 xxx.attrs
'''

soup.p['class']
soup.p['name']
soup.p.attrs

4、精准查找指定标签 1

(通过 tagname,id,class,其他值找)

'''
假设 要找 <div  class='div2'  id='id2' title='haha'  name='new'>  div的文本  </div>

1 - 通过标签名称查找
    xxx.find(tagname)
2 - 通过id的值
    xxx.find(id='')
3 - 通过class。class在python是关键字,用 class_
    xxx.find(class_='')
4 - 其他属性
    xxx.find(attrs = {})
5 - 通过文本内容
    xxx.find(text='')  找到文本内容
    xxx.find(tagname='' , text='')
'''

# soup 内的第一个p
soup.find('p')
# 找 id 等于ultwo 的标签
soup.find(id='ultwo')
# attrs 写法
soup.find(attrs={'class':'div11'})

5、精准查找指定标签 2

(通过 tagname,id,class,其他值找 . 找多个标签)

'''
find_all( )  findAll() ,返回多个标签
类似list

1 - 通过标签名称查找
xxx.find_all(tagname)
2 - 通过id的值
    xxx.find_all(id='')
3 - 通过class。class在python是关键字,用 class_
    xxx.find_all(class_='')
4 - 其他属性
    xxx.find_all(attrs = {})
5 - 通过文本内容
    xxx.find_all(text='')  找到文本内容
    xxx.find_all(tagname='' , text='')
'''

soup.find_all(id='ultwo')
# 想用 ul 得用 下标取值
soup.find_all(id='ultwo')[0]
# 找出 ultwo 内每个li的文本
lis = soup.find(id='ultwo').find_all('li')
[each.text for each in lis]

6、通过上下级关系查找标签对象

'''
xxx.parent   找父元素
 xxx.parents  层层向上找父层,

 xxx.children 返回所有孩子组成的迭代器
'''

soup.title.parent

soup.p.children
# 是一个迭代器
list(soup.p.children)

7、通过兄弟关系查找标签对象

'''
单词:
前面:previous
后面:next
兄弟姐妹: sibling

包含空格换行文本的兄弟
xxx.previous_sibling    xxx前面那个兄弟
xxx.next_sibling      xxx  后面那个兄弟

xxx.previous_siblings    xxx前面那个兄弟们
xxx.next_siblings      xxx  后面那个兄弟们

不 包含空格换行文本的兄弟
是函数
xxx.find_previous_sibling() xxx前面那个标签兄弟
xxx.find_previous_siblings()xxx前面那个标签兄弟们

xxx.find_next_sibling()   xxx后面那个标签兄弟
xxx.find_next_siblings()   xxx后面那个标签兄弟们
'''

soup.find(name='p',attrs={'name':'dromouse'})
soup.find(title='new')

li02 = soup.find('li',text='02')
li02.previous_sibling
li02.next_sibling
li02.find_previous_sibling()
li02.find_next_siblings()

8、多元素同时查找

'''
xxx.find_all(['a','b','div'] , 其他条件)
'''

soup.find_all(name=['title','h1','b'])

9、正则查找

'''
xxx.find( 属性= 正则表达式  )
xxx.find_all( 属性= 正则表达式  )
'''

# 找 class_= 的值是 sis 开头的
soup.find_all(class_= re.compile('sis\w+'))

10、是否递归查找

'''
xxx.find_all(  ... ,recursive=True/False)

是否 只查询第一代中符合条件的
'''

soup.body.find_all('ul',recursive=False)

11、控制查找个数

'''
xxx.find_all(yyy , limit=int) 限制查找的个数
'''

soup.ul.find_all('li',limit=2)

 

YXN-python

2024-05-15