Python基础入门 Day107 使用BeautifulSoup解析网页数据

72次阅读
没有评论

共计 2595 个字符,预计需要花费 7 分钟才能阅读完成。

在上一节中,我们学习了如何使用 requests 模块与网站交互,并保持会话状态。而在网络爬虫中,获取网页只是第一步,更关键的是从网页中提取出我们需要的数据。本节我们将学习一个非常强大的 HTML 解析库——BeautifulSoup,它能帮助我们轻松地从复杂的网页结构中提取信息。

一、BeautifulSoup 简介
BeautifulSoup 是 Python 中最常用的网页解析库之一,它能将 HTML 或 XML 文档解析成一棵树形结构,方便我们像操作 DOM 一样访问、搜索、修改网页元素。

安装命令如下:

pip install beautifulsoup4 lxml

我们同时安装 lxml 解析器,因为它速度快、容错性好。

二、解析 HTML 文档的基本用法
下面我们看一个最简单的例子:

from bs4 import BeautifulSoup

html_doc = """
<html><head><title>Python 学习网 </title></head>
<body>
<p class="title"><b>Python 基础入门 </b></p>
<p class="content"> 欢迎学习 Python 编程!</p>
<a href="http://example.com/one" class="link"> 第一个链接 </a>
<a href="http://example.com/two" class="link"> 第二个链接 </a>
</body></html>
"""

soup = BeautifulSoup(html_doc, "lxml")

print(" 网页标题:", soup.title.text)
print(" 网页第一个段落:", soup.p.text)
print(" 所有链接:", [a["href"] for a in soup.find_all("a")])

执行结果:

网页标题:Python 学习网
网页第一个段落:Python 基础入门
所有链接:['http://example.com/one', 'http://example.com/two']

三、常用的查找方法
BeautifulSoup 提供了多种查找网页元素的方法:

  1. find(tag_name):查找第一个匹配的标签
  2. find_all(tag_name):查找所有匹配的标签
  3. find(attrs={}):根据属性查找元素
  4. select(css_selector):使用 CSS 选择器查找

示例:

print(soup.find("p", class_="content").text)
print(soup.find_all("a"))
print(soup.select("a.link"))
print(soup.select_one("p.title").text)

四、提取元素的属性与文本
在抓取网页时,我们经常需要提取标签中的内容和属性。

link = soup.find("a")
print(" 链接地址:", link["href"])
print(" 链接文字:", link.text)

如果某个属性不存在,可以使用 .get() 方法避免报错:

print(link.get("id", " 没有 ID 属性 "))

五、解析真实网页内容
现在我们结合 requests 模块,获取网页并解析内容:

import requests
from bs4 import BeautifulSoup

url = "https://example.com"
response = requests.get(url)

soup = BeautifulSoup(response.text, "lxml")
for link in soup.find_all("a"):
    print(" 文字:", link.text, "| 地址:", link.get("href"))

这样,我们就能从真实网页中批量提取所有链接。

六、CSS 选择器的强大用法
BeautifulSoup 支持 CSS 选择器,这让我们像写前端 CSS 一样轻松定位元素。
常见选择器包括:

  • .class 选择指定类名的标签
  • #id 选择指定 ID 的标签
  • tag[attr=value] 选择带有特定属性的标签

示例:

soup.select("div.article > p.content")
soup.select("a[href^='http']")

前者表示“选择 div.article 下的p.content”,后者表示“选择所有 href 以 http 开头的 a 标签”。

七、结合循环提取结构化数据
以下示例展示如何提取新闻标题列表:

import requests
from bs4 import BeautifulSoup

url = "https://news.ycombinator.com/"
response = requests.get(url)
soup = BeautifulSoup(response.text, "lxml")

for item in soup.select(".titleline a"):
    print(item.text, " -> ", item["href"])

通过这种方式,我们可以抓取网页标题、作者、日期等各种信息。

八、解析复杂结构与层级关系
有时网页嵌套结构较深,我们可以使用 .parent.children.next_sibling 等属性遍历节点:

p = soup.find("p", class_="content")
print(" 父节点:", p.parent.name)
print(" 下一个兄弟节点:", p.find_next_sibling())

这些方法有助于处理复杂网页结构。

九、数据清洗与格式化
爬取的数据往往包含多余的空格、换行或 HTML 标签。我们可以使用 .strip()re 模块或 .get_text() 进行清洗:

text = soup.get_text(separator="\n", strip=True)
print(text)

十、小结
本节学习了使用 BeautifulSoup 解析网页的基本方法,掌握了以下技能:

  1. 创建 BeautifulSoup 对象并指定解析器;
  2. 使用 find()find_all()select() 搜索元素;
  3. 提取标签的文本和属性;
  4. 结合 requests 模块实现真实网页解析;
  5. 通过 CSS 选择器快速定位目标内容。

下一节,我们将学习如何使用 BeautifulSouprequests 结合,实现一个完整的网页爬虫程序,自动采集网页信息并保存为本地数据文件。

正文完
 0
评论(没有评论)