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’)
html5libBeautifulSoup(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库的使用的主要内容,如果未能解决你的问题,请参考以下文章

爬虫学习笔记 Beautiful Soup使用

python 爬虫学习--Beautiful Soup插件

Python爬虫学习使用Beautiful Soup库

Python爬虫学习Beautiful Soup库

python下很帅气的爬虫包 - Beautiful Soup 示例

Python爬虫学习实践基于Beautiful Soup的网站解析及数据可视化