新闻详情

新闻详情

首页 / 资讯中心 / 详情

BeautifulSoup实战:从入门到网页数据提取

发布时间:2026/10/1 10:36:27来源:尧图网络
BeautifulSoup实战:从入门到网页数据提取
它是一个用来解析HTML文档和XML文档的库, 它能够将那些复杂的HTML文档, 转换成一个那个树形结构, 而且这个结构也是比较复杂的, 使得我们能够在操作的时候, 去查找、去提取那些所需的内容, 下面我将要非常详细地去讲述它的使用流程, 并且还会结合一些实际的示例来进行说明。一、安装,以及关于解析器的内容, 这就是第一步的基础安装环节。pip install beautifulsoup4pip install lxml # 推荐使用的解析器也可以使用html.parserPython内置2. 我们来创建对象, 然后解析本地的HTML文件。from bs4 import BeautifulSoup# 解析本地HTML文件with open(example.html, r, encodingutf-8) as f:soup BeautifulSoup(f, lxml)(2) 把通过网络抓取得到的HTML代码进行解析, 弄明白里面的内容。import requestsfrom bs4 import BeautifulSoupurl https://example.comresponse requests.get(url)soup BeautifulSoup(response.text, lxml)(3) 把那个叫做soup的对象, 直接拿去进行打印操作。print(soup) # 打印整个HTML文档print(soup.prettify()) # 格式化输出更易读二、基本查找方法中的第一类情况, 是通过查看标签名字来进行查找的。# 获取第一个a标签first_a_tag soup.aprint(first_a_tag)# 获取第一个p标签first_p_tag soup.pprint(first_p_tag)请注意, 所采取的这样的方式仅仅能够获取文档里面第一个匹配到的标签。2. 获取该标签的各个属性信息, 然后进行操作。# 获取所有属性和属性值返回字典a_attrs soup.a.attrsprint(a_attrs) # 例如{href: https://example.com, class: [external]}# 获取特定属性值href_value soup.a[href] # 等同于 soup.a.attrs[href]print(href_value)# 安全获取属性属性不存在时返回Nonenon_existent_attr soup.a.get(nonexistent)print(non_existent_attr) # 输出: None3. 获取标签内容# 假设有以下HTML片段html_doc 直接文本内容嵌套文本内容内部span后面文本 soup BeautifulSoup(html_doc, lxml) # string属性只获取直系文本 p1_text soup.find(p).string print(p1_text) # 输出: 直接文本内容 p2_text soup.find_all(p)[1].string print(p2_text) # 输出: None因为有嵌套标签 # text/get_text()方法获取所有文本内容 p2_full_text soup.find_all(p)[1].text print(p2_full_text) # 输出: 嵌套文本内容内部span后面文本 p2_full_text_alt soup.find_all(p)[1].get_text() print(p2_full_text_alt) # 同上三、关于那个高级别的查找途径的第一个手段, 便是使用叫做 find() 的这种方法。# 查找第一个a标签first_a soup.find(a)# 查找具有特定属性的标签a_with_title soup.find(a, titleexample)a_with_class soup.find(a, class_external) # 注意class是Python关键字所以要加下划线a_with_id soup.find(div, idheader)# 使用多个条件查找specific_a soup.find(a, {class: external, title: Example})2. () 方法# 查找所有a标签all_a_tags soup.find_all(a)# 查找多种标签all_a_and_p soup.find_all([a, p])# 限制返回数量first_two_a soup.find_all(a, limit2)# 使用属性过滤external_links soup.find_all(a, class_external)specific_links soup.find_all(a, {data-category: news})# 使用函数过滤def has_href_but_no_class(tag):return tag.has_attr(href) and not tag.has_attr(class)custom_filter_links soup.find_all(has_href_but_no_class)3. 该()方法是通过CSS选择器来进行匹配的。# 通过id选择element soup.select(#header) # 返回列表# 通过class选择elements soup.select(.external-link) # 所有classexternal-link的元素# 通过标签选择all_p soup.select(p)# 层级选择器# 后代选择器空格分隔descendants soup.select(div p) # div下的所有p标签不限层级# 子选择器分隔children soup.select(div p) # 直接子级p标签# 组合选择complex_selection soup.select(div.content p.intro p.highlight)四、在实战示例的第1个环节中, 所完成的工作是提取所有的链接。from bs4 import BeautifulSoupimport requestsurl https://example.comresponse requests.get(url)soup BeautifulSoup(response.text, lxml)# 提取所有a标签的href属性links [a[href] for a in soup.find_all(a) if a.has_attr(href)]print(页面中的所有链接:)for link in links:print(link)从内容当中把那个新闻的标题拿过来, 然后再把摘要也提取出来。现在呢, 我们来假定一个HTML结构是这样的。新闻标题1新闻摘要1...新闻标题2新闻摘要2...提取代码news_items []for item in soup.select(.news-item):title item.select_one(.title).textsummary item.select_one(.summary).textnews_items.append({title: title, summary: summary})print(新闻列表:)for news in news_items:print(f标题: {news[title]})print(f摘要: {news[summary]}\n)从所给的表格之中, 将里面的那些具体数据给提取出来。假设有HTML表格[PROTECTED_c284d179d6b2fa7d64feafcad2aa7d8c]提取代码table_data []table soup.find(table, {id: data-table})# 提取表头headers [th.text for th in table.find_all(th)]# 提取表格内容for row in table.find_all(tr)[1:]: # 跳过表头行cells row.find_all(td)row_data {headers[i]: cell.text for i, cell in enumerate(cells)}table_data.append(row_data)print(表格数据:)for row in table_data:print(row)五、注意事项与技巧编码方面的问题。性能考虑对于解析器的选择这一事项。处理不完整HTML# 使用html5lib解析不完整的HTMLsoup BeautifulSoup(broken_html, html5lib)对那份文件的结构进行修改。# 修改标签内容tag soup.find(div)tag.string 新内容# 添加新标签new_tag soup.new_tag(a, hrefhttp://example.com)new_tag.string 新链接soup.body.append(new_tag)# 删除标签tag.decompose() # 完全删除tag.extract() # 从树中移除但保留需要对那些注解以及拥有特殊含义的字符串进行处理。for comment in soup.find_all(textlambda text: isinstance(text, Comment)):print(comment)六、常见问题解答Q1find()和()有什么区别A1关于动态加载的内容, 具体要如何去处理。A2它仅仅能够解析那种静态的HTML代码, 可是呢, 对于那些需要动态加载才能显示出来的内容。通过使用诸如等这些工具, 来获取那个已经完全渲染完毕之后的页面的相关信息。通过对网站的API接口进行分析, 然后直接从这个地方把数据给获取过来。为什么在很多情况下, 无法获得我们所希望得到的那些内容呢。A3其有可能产生的原因, 在于:这个网页里面使用了动态的方式, 去生成相关的内容。这些标签是存在隐藏条件的, 比如说, 样式方面可能是设置了隐藏状态这样的代码表现例如 style“:none” 这种情况。这个选择器不够精准, 意外地匹配到了其他的元素。解决方案你需要去检查网页源代码, 从而确认元素是否存在。使用选择器的时候, 需要更加精确一些。
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

CSDN企业账号运营全攻略:从开通到内容增长实战手册 2026/10/1 11:23:42

CSDN企业账号运营全攻略:从开通到内容增长实战手册

1. 从“个人写博客”到“企业做内容阵地”,CSDN企业账户到底解决什么问题先说一个很现实的问题:很多公司到现在还把CSDN当成“个人程序员写笔记的地方”,团队里谁有技术沉淀就自己注册一个号,零零散散发几篇“环境搭建踩坑记”&am…

阅读更多 →
Python界面元素控件库工具:可视化预览与参数速查指南 2026/10/1 11:23:42

Python界面元素控件库工具:可视化预览与参数速查指南

有一段时间我老在 tkinter 和 PyQt 之间反复横跳。当时接了个小需求,要给内网数据巡检脚本加个图形界面,需求不复杂——几个输入框、一个下拉框、一个日志输出区。按说一个小时就能搞定,可我硬是花了一晚上。原因不是不会写代码,而…

阅读更多 →
Keil逻辑分析仪报错Unknown Signal?一文讲透原因与解决方法 2026/10/1 11:23:42

Keil逻辑分析仪报错Unknown Signal?一文讲透原因与解决方法

Keil 5的波形仿真是个好东西,尤其是你想直观看看某个引脚翻转、某段延时程序到底跑了多久的时候,逻辑分析仪窗口能省很多事。但不少人在添加信号时会遇到一个很扎眼的报错:Unknown Signal。这行红字一出现,信号加不进去&#xff0…

阅读更多 →
俯视航拍小目标三轮车检测数据集:5756张双格式标注与YOLO训练实战 2026/10/1 11:23:42

俯视航拍小目标三轮车检测数据集:5756张双格式标注与YOLO训练实战

简介:面向俯视航拍场景中的小型交通工具检测任务,这份数据集包含五千七百五十六张现场图片及对应标注,类别覆盖遮阳蓬三轮车与三轮车两个类别,总计两万零二百七十七个标注框,能直接用于小目标检测模型的训练与评测。压…

阅读更多 →
NSGA-II求解水光互补多目标优化调度:Python实现与约束处理 2026/10/1 11:23:42

NSGA-II求解水光互补多目标优化调度:Python实现与约束处理

做水光互补调度这类问题,最头疼的不是仿真模型难搭,也不是数据清洗繁琐,而是目标太多、互相打架。既要发电量尽量大,又要出力曲线尽量平缓,还想尽量减少弃水弃光,这三个目标放到一个模型里,单目…

阅读更多 →
Java实现数值分析与机器学习算法:从矩阵到源码的工程实践 2026/10/1 11:23:36

Java实现数值分析与机器学习算法:从矩阵到源码的工程实践

简介:这是一套基于Java实现的数值分析、线性代数与机器学习算法设计源码包,面向科研人员、工程师及对数学建模和智能算法感兴趣的开发者。包内代码覆盖数值积分、微分方程求解、插值、最优化等常用数值方法,同时提供矩阵运算、行列式计算、特…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉