Python爬虫学习笔记.Beautiful Soup库的使用
Posted qq_51102350
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python爬虫学习笔记.Beautiful Soup库的使用相关的知识,希望对你有一定的参考价值。
一,概述
Python的一个html或XML的解析库,可用其方便的从网页中提取数据
Beautiful Soup自动将输入文档转换为Unicode编码,输出文档转换为UTF-8编码
二,解析器
解析器 | 使用方法 |
---|---|
Python标准库 | BeautifulSoup(markup,‘html.parser’) |
lxml HTML 解析器 | BeautifulSoup(markup,‘lxml’) |
lxml XML 解析器 | BeautifulSoup(markup,‘xml’) |
html5lib | BeautifulSoup(markup,’html5lib‘) |
三,基本使用
①初始化BeautifulSoup对象
②调用初始化所得的对象的各种属性和方法解析HTML代码
soup = BeautifulSoup(markup,parser)
参数:
第一个参数:要解析的对象,可以是HTML字符串或文件句柄
第二个参数:要使用的解析器
返回值:
返回BeautifulSoup对象
BeautifulSoup对象:
prettify()方法:
将要解析的字符串以标准格式输出
title属性:
可以获得title标签
title.string:
可以获得title标签的文本内容
引例:
from bs4 import BeautifulSoup
import lxml
import requests
headers ={
'user-agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.93 Safari/537.36'
}
response = requests.get('https://www.baidu.com/',headers=headers)
html = response.text
soup = BeautifulSoup(html,'lxml')
print(soup.prettify())
print(soup.title.string)
四,节点选择器
Ⅰ,使用
BeautifulSoup对象.节点名称
Ⅰ,bs4.element.Tag类型
对BeautifulSoup对象调用节点名称即可获得该类型
string属性:
调用该属性可获得该节点的文本内容
attrs属性:
获得该节点的所有属性,以字典形式陈列
contents属性:
获取该节点的所有直接子节点,以列表方式输出
children属性:
获取该节点的所有直接子节点,以生成器方式输出
from bs4 import BeautifulSoup
import lxml
import requests
headers ={
'user-agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.93 Safari/537.36'
}
response = requests.get('https://www.baidu.com/',headers=headers)
html = response.text
soup = BeautifulSoup(html,'lxml')
print(type(soup.title))
print(soup.title.string)
print(soup.head)
print(soup.p)#当有多个节点时,只会选择第一个节点的内容
Ⅱ,提取信息
①提取名称
name属性:
获取节点名称
from bs4 import BeautifulSoup
import lxml
import requests
headers ={
'user-agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.93 Safari/537.36'
}
response = requests.get('https://www.baidu.com/',headers=headers)
html = response.text
soup = BeautifulSoup(html,'lxml')
print(soup.title.name)
②获取属性
html属性:
属性 | 描述 |
---|---|
class | 为html元素定义一个或多个类名(classname)(类名从样式文件引入) |
id | 定义元素的唯一id |
title | 描述了元素的额外信息 (作为工具条使用) |
style | 规定元素的行内样式(inline style) |
方法:获得节点后,使用attrs来获取所有属性,得到一个包含所有属性的字典
from bs4 import BeautifulSoup
import lxml
import requests
headers ={
'user-agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.93 Safari/537.36'
}
response = requests.get('https://www.baidu.com/',headers=headers)
html = response.text
soup = BeautifulSoup(html,'lxml')
print(soup.p.attrs)
print(soup.p.attrs['class'])#获得单个属性的方法一,相当于访问键值来获得
print(soup.p['class'])#获取单个属性的方法二
③获取内容
方法:获得节点后,使用string来获取文本内容
from bs4 import BeautifulSoup
import lxml
import requests
headers ={
'user-agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.93 Safari/537.36'
}
response = requests.get('https。,模块,kkkkkkkkkl://www.baidu.com/',headers=headers)
html = response.text
soup = BeautifulSoup(html,'lxml')
print(soup.p.string)
④嵌套选择
当通过选择调用得到一个bs4.element.Tag类型后,可继续选择调用节点。
from bs4 import BeautifulSoup
import lxml
import requests
headers ={
'user-agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.93 Safari/537.36'
}
response = requests.get('https://www.baidu.com/',headers=headers)
html = response.text
soup = BeautifulSoup(html,'lxml')
print(soup.p.p)
⑤关联选择
有时不能直接选择出想要的节点,此时可以先选择一个节点作为基准,再去选择该节点的子节点、父节点和兄弟节点。
(1)得到子节点和子孙节点
contents属性:
获取该节点的所有直接子节点,以列表方式输出
children属性:
获取该节点的所有直接子节点,以生成器方式输出
descendants属性:
获取该节点的所有子孙节点,以生成器方式输出
from bs4 import BeautifulSoup
import lxml
import requests
headers ={
'user-agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.93 Safari/537.36'
}
response = requests.get('https://www.baidu.com/',headers=headers)
html = response.text
soup = BeautifulSoup(html,'lxml')
print(soup.p.contents)
for i,child in enumerate(soup.p.children):
print(i,child)
for i,descendant in enumerate(soup.p.descendants):
print(i,descendant)
(2)得到父节点和祖先节点
parent属性:获得父节点,输出父节点及其全部内容
代码:
from bs4 import BeautifulSoup
import lxml
import requests
headers ={
'user-agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.93 Safari/537.36'
}
response = requests.get('https://www.baidu.com/',headers=headers)
html = response.text
soup = BeautifulSoup(html,'lxml')
print(soup.p.a)
print(soup.p.a.parent)
print(soup.p)
parents属性:获得所有祖先节点,以生成器方式输出
from bs4 import BeautifulSoup
import lxml
import requests
headers ={
'user-agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.93 Safari/537.36'
}
response = requests.get('https://www.baidu.com/',headers=headers)
html = response.text
soup = BeautifulSoup(html,'lxml')
print(soup.p.a)
for i,parent in enumerate(soup.p.a.parents):
print(i,parent)
(3)得到兄弟节点
兄弟节点:同级的节点
next_sibling和previous_sibling属性:
用于查询一个兄弟节点
next_siblings和previous_siblings属性:
用于查询所有兄弟节点,生成器类型
from bs4 import BeautifulSoup
import lxml
import requests
headers ={
'user-agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.93 Safari/537.36'
}
response = requests.get('https://www.baidu.com/',headers=headers)
html = response.text
soup = BeautifulSoup(html,'lxml')
print(soup.p.previous_sibling)
print(soup.p.next_sibling)
for i,sibling in enumerate(soup.p.next_sibling.previous_siblings):
print(i,sibling)
for i,sibling in enumerate(soup.p.next_sibling.next_siblings):
print(i,sibling)
(4)提取信息
因为所选择得到的类型也是bs4.element.Tag类型,所以可以通过string,attrs等属性来获取信息。
五,方法选择器
应用属性的方式来选择节点速度快,但难以处理复杂的选择
为了处理复杂的选择,需要应用方法选择器
Ⅰ,find_all()方法
查找所有符合条件的节点
①基本信息
API:find_all(name,attrs,recursive,text,**kwargs)
返回类型:列表元素,列表由一个个bs4.element.Tag类型的元素构成
②name
可根据节点名来选择元素
from bs4 import BeautifulSoup
import lxml
import requests
headers ={
'user-agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.93 Safari/537.36'
}
response = requests.get('https://www.baidu.com/',headers=headers)
html = response.text
soup = BeautifulSoup(html,'lxml')
print(soup.find_all(name='a'))
print(type(soup.find_all(name='a')[1]))
for a in soup.find_all(name='a'):
print(a.string)
③attrs
可根据属性查询
attrs:字典类型
from bs4 import BeautifulSoup
import lxml
html = """<div class="panel">
<div class="panel-heading">
<h4>Hello</h4>
</div>
<div class="panel-body">
<ul class="list" id="list-1">
<li class="element">Foo</li>
<li class="element">Bar</li>
<li class="element">Jay</li>
</ul>
<ul class="list list-small" id="list-2">
<li class="element">Foo</li>
<li class="element">Bar</li>
</ul>
</div>
</div>
"""
soup = BeautifulSoup(html,'lxml')
attrs = {
'class':'element'
}
for result in soup.find_all(attrs=attrs):
print(result.string)
#对于常用的属性,如:id,class等可以采用这种方式来查询
for result in soup.find_all(class_='element'):
print(result.string)
④text
可根据文本内容来查询
传入的参数可以是字符串或正则表达式对象
from bs4 import BeautifulSoup
import re
import lxml
html = """<div class="panel">
<div class="panel-body">
<a>Hello, this is a link</a>
<a>Hello, this is a link, too</a>
</div>
</div>
"""
soup = BeautifulSoup(html,'lxml')
print(soup.find_all(text=re.compile(pattern='link')))
Ⅱ,其他方法
find() :仅返回第一个匹配到的元素
find_parents:返回所有祖先节点
find_parent:返回直接父节点
find_next_siblings:返回后面所有的兄弟节点
find_next_sibling:返回后面第一个兄弟节点
find_previous_siblings:返回前面所有的兄弟节点
find_previous_sibling:返回前面第一个兄弟节点
find_all_next:返回节点后所有符合条件的节点
find_next:返回节点后第一个符号条件的节点
find_all_previous:返回节点前所有符合条件的节点
find_previous:返回节点后第一个符合条件的节点
六,CSS选择器
以上是关于Python爬虫学习笔记.Beautiful Soup库的使用的主要内容,如果未能解决你的问题,请参考以下文章