导入
导入bs4之前先装两个库,bs4和lxml
pip install beautifulsoup4
pip install lxml
lxml安装后可以显著提高执行速度。
导入bs4
from bs4 import BeautifulSoup
解析字符串
BeautifulSoup()方法用于解析字符串,将字符串解析为soup对象,soup对象可以实现识别浏览器标签等功能。
该方法有两个参数,第一个是要解析的字符串,第二个是要使用的解析器。省略第二个参数后如果安装了lxml则默认为lxml,没安装则html.parser。lxml的速度明显高于html.parser,同时兼容性更佳。
soup = BeautifulSoup(html,"lxml")
获取节点
解析完字符串后就可以获取标签了,可以使用find,findall,select方法。
也可以直接用点调用标签名,这种用法同find方法。
find方法值返回查找到的第一个属性,有四个参数
soup.find(tag, attrs=None, recursive=True, string=None, kwargs)
tag
:标签名,字符串类型。attrs
:属性字典,用于进一步筛选标签。recursive
:是否递归查找子标签,默认为True。string
:字符串或正则表达式,用于查找包含特定文本的标签。
soup.find_all(tag, attrs=None, recursive=True, string=None, limit=None, kwargs)
多了一个limit参数,可以限制查找的数量。
soup.select()则是用css选择器来选择元素,参数是个字符串,内写css选择器
示例:
from bs4 import BeautifulSoup html_doc = """<html>
<head> <title>The Dormouse's story</title>
</head>
<body> <p class="title"><b>The Dormouse's story</b></p> <a href="http://example.com/elsie" class="sister" id="link1">Elsie</a> <a href="http://example.com/lacie" class="sister" id="link2">Lacie</a> <a href="http://example.com/tillie" class="sister" id="link3">Tillie</a>
</body>
</html>"""
soup = BeautifulSoup(html_doc, 'html.parser') # 获取标题
title = soup.title.text
print(title) # 获取第一个链接的href属性
first_link = soup.find('a', class_='sister')
print(first_link.get('href')) # 获取所有链接的href属性
all_links = soup.find_all('a', class_='sister')
for link in all_links: print(link.get('href'))soup.select('body>p')
soup.select('a[href*="example.com"]')# 查找href属性中包含"example.com"的a标签
获取节点属性
每个通过Beautiful Soup解析得到的标签都是一个Tag对象,它拥有一些属性和方法,可以用来获取标签的详细信息或进行进一步的操作。
.name
:获取标签的名称。.attrs
:获取标签的所有属性,以字典形式返回。.string
,.text 或.get_text()
:获取标签内的文本内容。.parent
:获取当前标签的父标签。.next_sibling
和.previous_sibling
:获取当前标签的下一个和上一个兄弟标签。
较为常用的是.text和.attrs,示例:
print(soup.p.text)
print(soup.p.attrs) # class的value是列表,name的value是字符串 对应属性的性质,一个标签可以有多个类而不能有多个name
print(soup.p.attrs.get("class")) #字典有两种取值方式 这种方式不会报错,下一行方式若没有对应的属性名会报错
print(soup.p.attrs["class"])
温馨提示
request库中的reponse对象的text属性就是一个字符串