Beautifulsoup 选择器
节点选择器:
选取元素的方法:
- 实例化beautifulsoup对象后 在对象后加上标签名即可 例如:soup.title
- 获取到的节点是tag对象
- 当有多个相同节点是,只会返回第一个节点
节点选择器嵌套选择的方法: soup.tag.tag 在tag类型的基础上再次选择得到的依旧是tag类型
关联选择的方法: 1.子节点 contents,children 2.子孙节点 descendants 3.父节点 parent 4.祖先节点 parents 5.兄弟节点 next_sblings previous_sblings previous_sbling next_sbling
from bs4 import BeautifulSoup
import bs4
import requests
url='https://www.baidu.com/'
html=requests.get(url)
html.encoding='utf-8'
html=html.text
print(html)
#传入参数,实例化对象
soup=BeautifulSoup(html,'lxml')
#定位元素title
print(soup.title)
#查看获取的结果类型 tag对象
print(type(soup.title))
#当html中有多个相同节点时 只会提取第一个节点
print(soup.a)
#节点选择器 提取信息 例如下方 在tag标签后加 name 返回标签名:a
print(soup.a.name)
#获取属性 在tag对象后加上attrs 返回一个带有属性的字典
print(soup.a.attrs)
print(soup.a.attrs['name'])
#获取tag内容 soup.tag.string 例子如下
print(soup.a.string)
html=requests.get('http://stu.nuist.edu.cn/LOGIN.ASPX')
soup=BeautifulSoup(html.text,'lxml')
#嵌套选择 获取 tr节点的子节点td里的内容 soup.tag.tag
print(soup.tr.td.string)
#关联选择方法:
#子节点 contents children
# 第一种contents返回列表
# 第二种children返回生成器
#不返回子孙节点
for i in soup.table.contents :
print(i)
print(type(i))
print('='*50)
tables=soup.table.children
#children 返回生成器 使用for循环 enumerate枚举便利
for i,child in enumerate(soup.table.children):
if type(child)==bs4.element.NavigableString:
continue
print(i)
print('='*50)
print(type(child))
#父节点 parent 返回的就是一个节点
#获取 td节点的父节点 tr 节点
print(soup.td.parent)
print('='*50)
#祖先节点 parents 返回的是一个生成器
#获取td节点的祖先节点
td=soup.td.parents
for i in enumerate(td):
print(i)
print('='*50)
# 兄弟节点
#next_sbling 后面一个节点
#next_sblings
#previous_sbling 前面一个节点
#previous_sblings 前面所有节点
CSS选择器:
soup.select()
1. id选择器需要使用#来定位元素 例如 获取第一个ul节点 他的id是list-1 则id选择器为 #list—1
2. 类选择器需要使用.来定位元素 例如 获取所有的ul 他们都有类list 则类选择器为 .list
3. 标签选择器 直接使用标签名来获取
4. 混合使用 每一个选择器中间空格
5. css嵌套选择与节点选择器的嵌套选择是一样的 在tag类型的基础上再次选择依旧是tag类型
6. css选择器获取属性的方法与之前的节点选择器获取属性的方法一样,使用attrs属性来获取
7. css选择器获取文本的方法依旧和节点选择器一样,使用string和strings属性来获取 strings获取当前及子孙节点的文本
import requests
from bs4 import BeautifulSoup
html=requests.get('http://stu.nuist.edu.cn/LOGIN.ASPX')
soup=BeautifulSoup(html.text,'lxml')
#标签选择 直接写标签名 返回列表
print(soup.select('td'))
#类选择 使用.来定位元素
# print(soup.select())
#id选择器使用#来定位元素
#混合选择器 混合使用 每一个选择器中间空格
print(soup.select('tr td'))
print(soup.select('#userbh'))
方法选择器:
使用 soup.findall(),soup.find() 通过传入参数来进行精准定位 find_all(),find(),find_parents(),find_parent(),find_next_siblings(),find_next_sibing(),find_previous_sibing(),find_previous_sibings(),find_all_next(),find_next(),find_all_previous(),find_previous() 以上方法的参数都是类似的: name:传入字符串参数 即标签名 可以传入字符串 正则表达式 列表 True attrs: recursive text **kwargs
from bs4 import BeautifulSoup
import requests
html=requests.get('http://stu.nuist.edu.cn/LOGIN.ASPX')
soup=BeautifulSoup(html.text,'lxml')
#find_all 方法 搜索当前节点的所有符合条件的节点
#find_all(name,attrs,recursive,text,**kwargs)
'''
name:传入字符串参数 即标签名 可以传入字符串 正则表达式 列表 True
attrs
recursive
text
**kwargs
'''
# 查找所有td标签节点
print(soup.findAll('td'))
#attrs参数 接受含有接受的属性值的标签
#参数形式为字典:
print(soup.findAll(attrs={'name':'save2','type':'button'}))
# **kwargs参数 接受常用的属性参数 如id class 与attrs类似
#参数形式 为 变量赋值的形式 如下
print(soup.findAll(id='save2',type='button'))
#注意: class 是python中的一个关键字 所以在使用的时候需要加一个下划线 即 class_='element'
#text参数 查询含有接受文本的标签 参数形式 字符串
print(soup.find(text='用户名:').parent)
#limit参数 限制返回结果的数量 参数形式为整数
#recursive参数 决定是否获取子孙节点 默认为:True
|