网络爬虫(四)之解析网页【BeautifulSoup】

在这里插入图片描述

使用BeautifulSoup

首先一定要先按照 bs4 和 lxml这两个模块:

pip install bs4
pip install lxml

解析器:
Beautiful Soup支持Python标准库中的HTML解析器,还支持一些第三方的解析器,其中一个是 lxml
另一个可供选择的解析器是纯Python实现的 html5lib , html5lib的解析方式与浏览器相同

下表列出了主要的解析器,以及它们的优缺点:

解析器 使用方法 优势 劣势
Python标准库 BeautifulSoup(markup, "html.parser") Python的内置标准库,执行速度适中,文档容错能力强 Python 2.7.3 or 3.2.2)前 的版本中文档容错能力差
lxml HTML 解析器 BeautifulSoup(markup, "lxml") 速度快、文档容错能力强 需要安装C语言库
lxml XML 解析器 BeautifulSoup(markup, ["lxml-xml"])
BeautifulSoup(markup, "xml")
速度快,唯一支持XML的解析器 需要安装C语言库
html5lib BeautifulSoup(markup, "html5lib") 最好的容错性,以浏览器的方式解析文档,生成HTML5格式的文档 速度慢,不依赖外部扩展

推荐使用lxml作为解析器,因为效率更高. 在Python2.7.3之前的版本和Python3中3.2.2之前的版本,必须安装lxml或html5lib, 因为那些Python版本的标准库中内置的HTML解析方法不够稳定.

提示: 如果一段HTML或XML文档格式不正确的话,那么在不同的解析器中返回的结果可能是不一样的,查看 解析器之间的区别 了解更多细节

案例

"""
使用BeautifulSoup
"""
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>

<p class="story">Once upon a time there were three little sisters; and their names were
<a href="http://example.com/elsie" class="sister" id="link1">Elsie</a>,
<a href="http://example.com/lacie" class="sister" id="link2">Lacie</a> and
<a href="http://example.com/tillie" class="sister" id="link3">Tillie</a>;
and they lived at the bottom of a well.</p>

<p class="story">...</p>
"""

# 需要实例化BeautifulSoup对象
# html_doc 是html 文档字符串  lxml 是HTML解析器
soup = BeautifulSoup(html_doc, "lxml")

# 格式化输出(把HTML按照严格的缩进格式输出)
# print(soup) # 这是乱的 没有格式
# print(soup.prettify())

# 获取标签
# tag = soup.title #这是获取到title标签 多个标签名只返回一个
# name = tag.name # 这是获取标签名
# str = tag.string # 这是获取标签内容
# print(tag)
# print(name)
# print(str)

# 这里会将整个标签字符串输出 :  <p class="title"><b>The Dormouse's story</b></p>
# tag = soup.p
# print(tag)

# 获取所有的p标签 并且 class 为 story的
# tags = soup.find_all("p", attrs={"class": "story"})
# print(len(tags))  # 2

# 这是获取到 class 为 title的 (如果属性为class时,需要写成class_="属性值")
# tag = soup.find(class_="title")
# print(tag)

# 获取属性的值
# tag = soup.p
# str = tag.get("class")
# print(str)
# 这样也能获取到
# str = soup.p["class"]
# print(str)
#
# str = soup.a.get("id")
# print(str)

# 获取a标签所有的属性值
# strs = soup.a.attrs
# print(strs)  # 返回结果是一个字典

# 获取上一节标签的标签名
# print(soup.title.parent.name) # 这里返回的是 head

# 这是获取到 body 标签
# tag = soup.body
# descendants 是获取到 所有子孙节点
# for c in tag.descendants:
#     print(c)
#     print("*" * 30)



# 先获取第一个a
tag = soup.a
print(tag.next_sibling.next_sibling)
print(type(tag.next_sibling.next_siblings))

BeautifulSoup综合案例:爬取“猫眼电影的排行榜”

"""
BeautifulSoup综合案例:爬取“猫眼电影的排行榜”
"""
import requests
from bs4 import BeautifulSoup
import os

# 设置请求头,模拟浏览器去获取数据,所以要带这个请求头,但是一定要使用自己的
header = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.25 Safari/537.36 Core/1.70.3741.400 QQBrowser/10.5.3863.400",
}

response = requests.get("https://maoyan.com/board/4", headers=header)

# 获取当前根目录
root = os.getcwd()

# 在根目录中创建文件夹"第1页"
os.mkdir("第1页")

# 改变当前目录
os.chdir("第1页")

if response.status_code == 200:
    # 解析网页
    soup = BeautifulSoup(response.text, "lxml")
    imgTags = soup.find_all("img", attrs={"class":"board-img"})
    for imgTag in imgTags:
        name = imgTag.get("alt");
        src = imgTag.get("data-src");
        # 跑去请求图片
        resp = requests.get(src, headers=header)
        with open(f"{name}.png", "wb") as f:
            # 保存图片
            f.write(resp.content)
        print(f"{name}{src} 保存成功")

在这里插入图片描述

BeautifulSoup综合案例:爬取“最好大学网”排行

"""
BeautifulSoup综合案例:
爬取“最好大学网”排行
"""
import requests
from bs4 import BeautifulSoup


# 设置请求头,模拟浏览器去获取数据,所以要带这个请求头,但是一定要使用自己的
header = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.25 Safari/537.36 Core/1.70.3741.400 QQBrowser/10.5.3863.400",
}
response = requests.get("http://www.zuihaodaxue.com/zuihaodaxuepaiming2019.html", headers=header)
response.encoding = "utf-8"

if response.status_code == 200:
    soup = BeautifulSoup(response.text, "lxml")
    trTages = soup.find_all("tr", attrs={"class": "alt"})
    for trTag in trTages:
        # 在子节点里找内容
        id = trTag.contents[0].string
        name = trTag.contents[1].string
        addr = trTag.contents[2].string
        soc = trTag.contents[3].string
        print(f"{id} {name} {addr} {soc}")

在这里插入图片描述

©️2020 CSDN 皮肤主题: 大白 设计师: CSDN官方博客 返回首页
实付0元
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值