1. 节点选择器
from bs4 import BeautifulSoup
html = """
<html>
<head><title>The test!</title></head>
<body>
<ol>
<li><a href="https://blog.csdn.net/nanhuaibeian/article/details/89020249" rel="nofollow" target="_blank">入门</a></li>
<li><a href="https://blog.csdn.net/nanhuaibeian/article/details/89075453" rel="nofollow" target="_blank">使用urllib(request)</a></li>
<li><a href="https://blog.csdn.net/nanhuaibeian/article/details/89163384" rel="nofollow" target="_blank">使用urllib(error)</a></li>
<li><a href="https://blog.csdn.net/nanhuaibeian/article/details/89166027" rel="nofollow" target="_blank">使用requests</a></li>
<li><a href="https://blog.csdn.net/nanhuaibeian/article/details/89041626" rel="nofollow" target="_blank">下载一只猫</a></li>
<li><a href="https://blog.csdn.net/nanhuaibeian/article/details/89048805" rel="nofollow" target="_blank">翻译文本</a></li>
</ol>
"""
soup = BeautifulSoup(html,'lxml')
# 利用name属性获取节点的名称
print(soup.head.name)
# 调用attrs获取所有属性
print(soup.a.attrs)
# 获取某个属性值
print(soup.a['href']) # print(soup.a.attrs['href'])
# 获取文本内容,选择第一a节点,获取的文本也是第一个a节点里面的文本
print(soup.a.string)
2. 方法选择器
- find_all()
findall(name,attrs,recursive,text,**kwargs)
顾名思义,就是查询所有符合条件的元素。给他传入一些属性或文本,就可以得到符合条件的元素,返回的是一个列表。
name:
soup = BeautifulSoup(html,'lxml')
print(soup.find_all(name='li'))
这里调用find_all()方法,传入name参数,参数值为li。即查询出所有的li节点,返回结果时列表类型.
from bs4 import BeautifulSoup
soup = BeautifulSoup(html,'lxml')
# 查询出所有的li节点后,继续查内部的a节点
for each in soup.find_all(name='li'):
print(each.find_all(name='a'))
print(each.find_all(name='a')[0].string) # 查询文本
print(each.find_all(name='a')[0]['href']) # 查询属性href对应的值
attrs:
传入一些属性来查询
soup = BeautifulSoup(html,'lxml')
for each in soup.find_all(name='li'):
# 查询属性href包含"/details/89041626"的元素
print(each.find_all(href=re.compile("/details/89041626")))
text:
text参数可用来匹配节点的文本,传入的形式可以是字符串,可以是正则表达式对象
soup = BeautifulSoup(html,'lxml')
for each in soup.find_all(name='li'):
# 传入text参数, 查询内部包含“猫”的文本信息
print(each.find_all(text=re.compile('猫')))