七、使用BeautifulSoup4解析HTML实战(一)

本文涉及的产品
云解析 DNS,旗舰版 1个月
云解析DNS,个人版 1个月
全局流量管理 GTM,标准版 1个月
简介: 七、使用BeautifulSoup4解析HTML实战(一)
+关注继续查看

🍀分析网站

本节我们的目标网站是新浪微博的热搜榜,我们的目标是获取热榜的名称和热度值

首先通过检查,查看一些标签

image

不难看出,我们想要的数据是包含在class="td-02"的td标签中

image

热搜内容在td标签下的a标签

image

热度位于td标签下的span标签


🍀爬取前的准备

首先导入需要的库

# 导入模块
import requests
from bs4 import BeautifulSoup

之后定义url和请求头,在请求头这里,寻常的网站或许只需要User-Agent,这里还需要一个Cookie

在这里插入代码片# 定义url和请求头
url =  'https://s.weibo.com/top/summary?display=0&retcode=6102'
_headers = {
                "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36",
                "Cookie": "SUBP=0033WrSXqPxfM72-Ws9jqgMF55529P9D9WW2kX-Z46lRbEGNeGGOqQzg; SINAGLOBAL=1879006065688.1335.1674544342950; UOR=,,www.baidu.com; SUB=_2AkMUum_nf8NxqwJRmP8cy2rkbYh1zQ_EieKi5p48JRMxHRl-yT9vqmEptRB6PzpBCFr8Nw9WHg85yXpbEGjv_BB4-91Q; _s_tentry=weibo.com; Apache=5265586173710.342.1689125693519; ULV=1689125693521:3:1:1:5265586173710.342.1689125693519:1675905464675"
            }

之后进行发送请求和实例化对象

# 发送请求
response = requests.get(url,headers=_headers)
content = response.content.decode('utf8')
# 实例化对象
soup = BeautifulSoup(content, 'lxml')

这里我们使用的是lxml HTML解析器,市面上90%的网站都可以用它解析,但是还是有一些漏网之鱼,下面表格中介绍了一些其他的解析器

解析器使用方法优势劣势
Python标准库soup = BeautifulSoup(‘html’,‘html.parser’)速度适中在Python老版本中文容错力差
lxml HTML解析器soup = BeautifulSoup(‘html’,‘lxml’)速度快需要安装C语言库
lxml XML解析器soup = BeautifulSoup(‘html’,‘xml’)速度快需要安装C语言库
html5libsoup = BeautifulSoup(‘html’,‘html5lib’)以浏览器的方式解析文档速度慢

介绍完这几种解析器后,我们接下来要做的就是使用bs4来进行获取数据,细心的小伙伴可以用Xpath进行对比一下


🍀获取数据

获取数据的步骤比较简单,根据先前的分析,我们使用find_all进行获取即可,这里注意我们需要使用列表切一下,因为我们想要获取的热榜是从第二个开始的

接下来定义一个列表,使用一个for循环,将想要提取的数据依次提取即可,最后保存到定义好的列表中

# 提取数据
tds = soup.find_all('td',class_="td-02")[1:]
weibos = []
for td in tds:
    # 内容
    event = td.find_all('a')[0].string  # 只把对象里面的内容提取出来
    # 热度
    hot = td.find_all('span')[0].string
    weibo = {
        "event": event,
        "hot": hot
    }
    weibos.append(weibo)
print(weibos)

🍀完整代码

# 导入模块
import requests
from bs4 import BeautifulSoup
# 定义url和请求头
url =  'https://s.weibo.com/top/summary?display=0&retcode=6102'
_headers = {
                "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36",
                "Cookie": "SUBP=0033WrSXqPxfM72-Ws9jqgMF55529P9D9WW2kX-Z46lRbEGNeGGOqQzg; SINAGLOBAL=1879006065688.1335.1674544342950; UOR=,,www.baidu.com; SUB=_2AkMUum_nf8NxqwJRmP8cy2rkbYh1zQ_EieKi5p48JRMxHRl-yT9vqmEptRB6PzpBCFr8Nw9WHg85yXpbEGjv_BB4-91Q; _s_tentry=weibo.com; Apache=5265586173710.342.1689125693519; ULV=1689125693521:3:1:1:5265586173710.342.1689125693519:1675905464675"
            }
# 发送请求
response = requests.get(url,headers=_headers)
content = response.content.decode('utf8')
# 实例化对象
soup = BeautifulSoup(content, 'lxml')
# 提取数据
tds = soup.find_all('td',class_="td-02")[1:]
weibos = []
for td in tds:
    # 内容
    event = td.find_all('a')[0].string  # 只把对象里面的内容提取出来
    # 热度
    hot = td.find_all('span')[0].string
    weibo = {
        "event": event,
        "hot": hot
    }
    weibos.append(weibo)
print(weibos)

🍀find_all()介绍

完成了这次的实战可能有的人对这个方法还是有些不太了解,接下来,针对此方法,我来详细介绍一下

在BeautifulSoup库(通常作为bs4导入)中,find_all是一个常用的方法,用于在HTML或XML文档中查找符合特定条件的所有元素。

find_all的基本语法是:

find_all(name, attrs, recursive, string, limit, **kwargs)

其中,参数的含义如下:

  • name:要查找的元素标签名称或标签列表。可以使用字符串、正则表达式或函数来匹配标签名。
  • attrs:要查找的元素的属性值(可选)。可以使用字典或关键字参数来指定多个属性和对应的值。
  • recursive:指定是否递归查找子孙节点,默认为 True。
  • string:用于查找具有指定文本内容的元素(可选)。
  • limit:限制返回的结果数量的最大值(可选)。

下面是一些使用find_all的示例:

  1. 查找特定标签的所有元素:
soup.find_all("a")   # 查找所有 <a> 标签的元素
soup.find_all(["a", "img"])   # 查找所有 <a> 和 <img> 标签的元素
  1. 查找具有特定属性值的元素:
soup.find_all(attrs={"class": "title"})   # 查找所有 class 属性为 "title" 的元素
soup.find_all(id="content")   # 查找所有 id 属性为 "content" 的元素
  1. 使用正则表达式进行匹配:
import re
soup.find_all(re.compile("^h"))   # 查找标签名以 "h" 开头的元素
soup.find_all(href=re.compile("example.com"))   # 查找所有href属性包含 "example.com" 的元素
  1. 查找具有特定文本内容的元素:
soup.find_all(string="Hello")   # 查找文本内容为 "Hello" 的元素
soup.find_all(string=re.compile("^H"))   # 查找文本内容以 "H" 开头的元素

这些只是find_all方法的一些基本用法示例,我们当然还可以根据具体情况组合和使用不同的参数来实现更复杂的元素查找。

image

挑战与创造都是很痛苦的,但是很充实。


相关文章
|
2天前
|
数据采集 Python
python HTML文件标题解析问题的挑战
python HTML文件标题解析问题的挑战
|
7天前
|
数据采集 JavaScript 小程序
laravel8(四)使用simple_html_dom库解析html
首先:simple_html_dom下载地址: github.com/samacs/simp… 这是一个PHP解析html的一个库。 这玩意还是很有用的,比如我们在使用PHP做爬虫的时候,需要解析html中的内容等。 他的强大之处不仅仅只是帮助我们验证html文档;更能解析不符合W3C标准的html文档。 关于如何引入第三方类库,请移步《laravel5.8(十)引入第三方类库》laravel8中的设置方法也大同小异。 一:加载 html 有三种方式调用这个类: 1. 从url中加载html文档 2. 从字符串中加载html文档 3. 从文件中加载html文档
20 1
|
1月前
|
数据采集 JavaScript 前端开发
Node.js 中的 HTML 解析:技巧和最佳实践
在 Web 开发中,解析 HTML 是一个常见的任务,特别是当我们需要从网页中提取数据或操作 DOM 时。掌握 Node.js 中解析 HTML 的各种方式,可以大大提高我们提取和处理网页数据的效率。本文将介绍如何在 Node.js 中解析 HTML。
|
2月前
|
XML 存储 JavaScript
XML与html解析,区别,如何使用
XML与html解析,区别,如何使用
|
2月前
|
机器学习/深度学习 数据采集 XML
使用BeautifulSoup解析豆瓣网站的HTML内容并查找图片链接
使用BeautifulSoup解析豆瓣网站的HTML内容并查找图片链接
|
2月前
|
存储 自然语言处理 JavaScript
【Vue2.0源码学习】模板编译篇-模板解析阶段(HTML解析器)
【Vue2.0源码学习】模板编译篇-模板解析阶段(HTML解析器)
17 0
|
4月前
|
前端开发 JavaScript
React 解析html标签
React 解析html标签
46 0
|
4月前
|
Java
Java HTTP请求 如何获取并解析返回的HTML内容
在Java开发中,经常会遇到需要获取网页内容的情况。而HTTP请求是实现这一目标的常用方法之一。本文将介绍如何使用Java进行HTTP请求,并解析返回的HTML内容。
206 0
|
4月前
|
数据采集 JSON JavaScript
jsoup爬虫发送get、post请求、解析html、获取json
jsoup爬虫发送get、post请求、解析html、获取json
186 0
【项目实战】解析HTML并处理特殊符号
【项目实战】解析HTML并处理特殊符号
相关产品
云迁移中心
推荐文章
更多
推荐镜像
更多