本文主要是介绍如何从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解析网页获取数据的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!