如何从yaml取值,如何处理编码,使用BeautifulSoup解析网页获取数据

本文主要是介绍如何从yaml取值,如何处理编码,使用BeautifulSoup解析网页获取数据,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

import requests
from bs4 import BeautifulSoup
import yaml
import chardet
#从doctor.yaml里面引入网址
with open('doctor.yaml', 'r', encoding='utf-8') as file:urls_data = yaml.safe_load(file)
#把查出的数据写入doctor_info.txt中
with open('doctor_info.txt', 'w', encoding='utf-8') as output_file:#从yaml中取出'https://1.hml,"标题1"'for url_data in urls_data.get('urls', []):#把数据中第一个值https://1.hml,付给了URLurl = url_data.split(',')[0].strip()#把数据中第二个值标题1,付给了department   department = url_data.split(',')[1].strip()#把department的值写入结果文件中output_file.write(f"\n{department}\n")# 获取 URLresponse = requests.get(url)# 在这段代码中,首先使用 `chardet.detect(response.content)` 来检测网页内容的编码格式,并将其储存在 `detected_encoding` 中。然后,通过循环遍历 `possible_encodings` 中的不同编码格式,尝试用每一种编码格式来解码网页内容。如果成功解码(没有引发 `UnicodeDecodeError`),则将解码后的内容存储在 `html_content` 中,并通过 `break` 跳出循环。否则,继续尝试下一种编码格式。如果所有尝试都失败,即 `html_content` 仍为 `None`,则输出"无法解码网页内容"并继续下一个 URL 的处理。#detected_encoding = chardet.detect(response.content)['encoding']possible_encodings = ['utf-8', 'gbk', 'gb2312', 'big5']html_content = Nonefor encoding in possible_encodings:try:html_content = response.content.decode(encoding)breakexcept UnicodeDecodeError:passif html_content is None:print("无法解码网页内容")continue
#`BeautifulSoup`库中的 `html.parser` 解析器是Python的内置解析器,用于解析HTML文档soup = BeautifulSoup(html_content, 'html.parser')# 查找 <div class="z-new-doctor mt15"> 元素z_new_doctor = soup.find('div', class_='z-new-doctor mt15')if z_new_doctor:# 查找 所有<div class="schedule-list clearfix pt15 pb20 pl10 pr10 bdr-botd graydeep"> 元素schedule_lists = z_new_doctor.find_all('div', class_='schedule-list clearfix pt15 pb20 pl10 pr10 bdr-botd graydeep')#每个<div class="schedule-list clearfix pt15 pb20 pl10 pr10 bdr-botd graydeep"> 元素做同样的处理for schedule_list in schedule_lists:# 1.查找所有 <div class="fl ml10 lh24"> 元素fl_elements = schedule_list.find_all('div', class_='fl ml10 lh24')#取<div class="fl ml10 lh24"> 元素下前两个值for fl_element in fl_elements:doctor_info = fl_element.get_text().split()[:2]  # 获取两个文字值,第一个为医生姓名,第二个为医生职称if len(doctor_info) == 2:doctor_name, doctor_title = doctor_info#写入结果文件output_file.write(f"医生姓名: {doctor_name}\n")output_file.write(f"医生职称: {doctor_title}\n")# 2.查找所有 <div class="sd-doc-done sd-doc-done-w fl pl15 lh24 tc"> 元素sd_done_elements = schedule_list.find_all('div', class_='sd-doc-done sd-doc-done-w fl pl15 lh24 tc')for sd_done_element in sd_done_elements:#取到的医生擅长写入结果文件output_file.write(f"擅长: {sd_done_element.get_text()}\n") # 3.查找img下的src,把值写入结果,如果值是'//z.xywy.com/doc/images_new/doctor_c.jpg'替换成空img_tag = schedule_list.find('img')if img_tag and 'src' in img_tag.attrs:img_src = img_tag['src']# 将提取到的 src 中的内容进行替换new_src = img_src.replace('//z.xywy.com/doc/images_new/doctor_c.jpg', ' ')output_file.write(f"头像地址: {new_src}\n")  # 输出替换后的 src 属性值else:print(f"未找到 {z_new_doctor} 元素")

doctor.yaml

urls:- 'https://1.tml,"标题1"'- 'https://2.htm,"标题2"'

结果:
标题1
医生姓名1
职称1
擅长1
头像1

 医生姓名2职称2擅长2头像2

标题2
医生姓名3
职称3
擅长3
头像3

这篇关于如何从yaml取值,如何处理编码,使用BeautifulSoup解析网页获取数据的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/978537

相关文章

nginx -t、nginx -s stop 和 nginx -s reload 命令的详细解析(结合应用场景)

《nginx-t、nginx-sstop和nginx-sreload命令的详细解析(结合应用场景)》本文解析Nginx的-t、-sstop、-sreload命令,分别用于配置语法检... 以下是关于 nginx -t、nginx -s stop 和 nginx -s reload 命令的详细解析,结合实际应

MyBatis中$与#的区别解析

《MyBatis中$与#的区别解析》文章浏览阅读314次,点赞4次,收藏6次。MyBatis使用#{}作为参数占位符时,会创建预处理语句(PreparedStatement),并将参数值作为预处理语句... 目录一、介绍二、sql注入风险实例一、介绍#(井号):MyBATis使用#{}作为参数占位符时,会

使用Python删除Excel中的行列和单元格示例详解

《使用Python删除Excel中的行列和单元格示例详解》在处理Excel数据时,删除不需要的行、列或单元格是一项常见且必要的操作,本文将使用Python脚本实现对Excel表格的高效自动化处理,感兴... 目录开发环境准备使用 python 删除 Excphpel 表格中的行删除特定行删除空白行删除含指定

SpringBoot结合Docker进行容器化处理指南

《SpringBoot结合Docker进行容器化处理指南》在当今快速发展的软件工程领域,SpringBoot和Docker已经成为现代Java开发者的必备工具,本文将深入讲解如何将一个SpringBo... 目录前言一、为什么选择 Spring Bootjavascript + docker1. 快速部署与

深入理解Go语言中二维切片的使用

《深入理解Go语言中二维切片的使用》本文深入讲解了Go语言中二维切片的概念与应用,用于表示矩阵、表格等二维数据结构,文中通过示例代码介绍的非常详细,需要的朋友们下面随着小编来一起学习学习吧... 目录引言二维切片的基本概念定义创建二维切片二维切片的操作访问元素修改元素遍历二维切片二维切片的动态调整追加行动态

prometheus如何使用pushgateway监控网路丢包

《prometheus如何使用pushgateway监控网路丢包》:本文主要介绍prometheus如何使用pushgateway监控网路丢包问题,具有很好的参考价值,希望对大家有所帮助,如有错误... 目录监控网路丢包脚本数据图表总结监控网路丢包脚本[root@gtcq-gt-monitor-prome

Python通用唯一标识符模块uuid使用案例详解

《Python通用唯一标识符模块uuid使用案例详解》Pythonuuid模块用于生成128位全局唯一标识符,支持UUID1-5版本,适用于分布式系统、数据库主键等场景,需注意隐私、碰撞概率及存储优... 目录简介核心功能1. UUID版本2. UUID属性3. 命名空间使用场景1. 生成唯一标识符2. 数

Java中读取YAML文件配置信息常见问题及解决方法

《Java中读取YAML文件配置信息常见问题及解决方法》:本文主要介绍Java中读取YAML文件配置信息常见问题及解决方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要... 目录1 使用Spring Boot的@ConfigurationProperties2. 使用@Valu

SpringBoot中如何使用Assert进行断言校验

《SpringBoot中如何使用Assert进行断言校验》Java提供了内置的assert机制,而Spring框架也提供了更强大的Assert工具类来帮助开发者进行参数校验和状态检查,下... 目录前言一、Java 原生assert简介1.1 使用方式1.2 示例代码1.3 优缺点分析二、Spring Fr

Android kotlin中 Channel 和 Flow 的区别和选择使用场景分析

《Androidkotlin中Channel和Flow的区别和选择使用场景分析》Kotlin协程中,Flow是冷数据流,按需触发,适合响应式数据处理;Channel是热数据流,持续发送,支持... 目录一、基本概念界定FlowChannel二、核心特性对比数据生产触发条件生产与消费的关系背压处理机制生命周期