爬取日本常用汉字秘籍

前言

昨天投简历时遇到了这样的一个笔试。本以为会是数据结构算法之类的没想到直接发了一个word直接提需求,感觉挺有意思就写了这篇文章,感兴趣的朋友可以看看。
image.png

image.png

1. 网页内容解析

首先,我们通过请求网页获取到日本常用汉字的链接列表。然后,针对每个汉字链接,我们提取网页中相应部分的 HTML 内容。

首先分析页面结构

image.png
发现这些汉字有着相同的规律,先将.parts_box类标签拿到之后再用css选择器拿到对应的汉字标签.

url = 'https://kanji.jitenon.jp/cat/joyo.html'
response = requests.get(url)
response.encoding = 'utf-8'
html_content = response.textcss_selector = '#content > div.bushu_wrap > div > .parts_box '
parsed_elements = parse_css(html_content, css_selector)
urllist = []
for element in parsed_elements:chineslinks = element.select(".search_parts > li > a")for chineslink in chineslinks:chines = {}chines['link'] = chineslink['href']chines['name'] = chineslink.texturllist.append(chines)

首先,我用了Python的requests库发送了一个HTTP请求,抓取了目标网站的内容。然后,用了BeautifulSoup库进行HTML解析,找到了我需要的信息。通过一个简单的CSS选择器,我成功地定位到了汉字链接的位置。

接着,我遍历了这些链接,将它们逐个存储在了一个名为urllist的列表中。每个链接都包含着汉字的名称和对应的链接地址。

2.详情页解析

image.png

image.png
通过对比前两字可以发现每个字的介绍里的属性都有可能不一样,因此这里的思路是先拿到这部分标签的整体text,然后通过正则去进行筛选匹配。在进行字符拼接时加上分隔符,为之后的对转成列表形式时的字符分割做准备。

def get_detailed(chines):url = chines['link']response = requests.get(url)response.encoding = 'utf-8'html_content = response.textcss_selector = '#content > article > div.search_data > div > div.kanji_wrap > div.kanji_right > div > section > table >tbody > tr 'parsed_elements = parse_css(html_content, css_selector)text = ''separator = '%'  # 定义分隔符for element in parsed_elements:# print(element.text)text =text+ ' '.join(element.stripped_strings)+ separatorfont = {}font['name'] = chines['name']## fontkey = element.select(".ruby_switch")[0].text# fontvaule = element.select(".ruby_switch > span")# print(fontkey)# print(text)def extract_text_between_patterns(text, start_patterns, end_patterns):"""从文本中提取两个模式之间的文本。参数:text (str): 待提取文本。start_patterns (list): 匹配文本起始的模式列表。end_patterns (list): 匹配文本结束的模式列表。返回:list: 匹配的文本列表,如果没有匹配项则返回None。"""matches = []  # 存储匹配结果的列表for start_pattern in start_patterns:for end_pattern in end_patterns:# 查找所有起始模式的位置start_matches = [match.end() for match in re.finditer(start_pattern, text)]# 查找所有结束模式的位置end_matches = [match.start() for match in re.finditer(end_pattern, text)]# 遍历每个起始位置和结束位置的组合for start_match in start_matches:for end_match in end_matches:if start_match < end_match:  # 确保结束位置在起始位置之后subtext = text[start_match:end_match]  # 提取子文本# 检查子文本中是否包含其他模式if not any(pattern in subtext for pattern in start_patterns[1:] + end_patterns):# 添加匹配的子文本到结果列表中,并保留第一个关键词matches.append(text[text.find(start_pattern):end_match].strip())break  # 找到一个匹配后退出当前循环return matches if matches else None  # 返回匹配结果列表,如果列表为空则返回None# 定义关键字列表start_patterns = ['部首', '画数', '音 読 み', '訓 読 み', '意味', '成 り 立 ち', '種別', '分類', '学年', '漢字 検定', 'JIS 水準']end_patterns = ['画数', '音 読 み', '訓 読 み', '意味', '成 り 立 ち', '種別', '分類', '学年', '漢字 検定', 'JIS 水準']# 调用函数进行提取results = extract_text_between_patterns(text, start_patterns, end_patterns)# print(results)# for i in range(len(results)):#     print(results[i])def create_dict(data, patterns):hanzi_dict = {}for item in data:for pattern in patterns:if pattern in item:key, value = item.split(pattern, 1)hanzi_dict[pattern.strip()] = value.strip()breakreturn hanzi_dict# 测试patterns = ['部首', '画数', '音 読 み', '訓 読 み', '意味', '成 り 立 ち', '種別', '分類', '学年', '漢字 検定', 'JIS 水準']# 解析数据hanzi_dict = create_dict(results, patterns)# 遍历hanzi_dictfor key, value in hanzi_dict.items():parts = hanzi_dict[key].split('%')parts.pop()  # 移除最后一个空字符串if  len(parts) == 1:hanzi_dict[key] = str(parts[0])continuehanzi_dict[key] = partsreturn hanzi_dict

汉字详情页解析函数 get_detailed

该函数的主要目的是解析汉字的详情页,从中提取出部首、画数、音读み等关键信息,并以字典的形式返回。

  • 输入参数

    • chines:一个包含汉字链接和名称的字典,包括键 'link''name'
  • 功能

    1. 通过给定的链接获取汉字的详情页HTML内容。
    2. 使用CSS选择器定位到包含关键信息的元素。
    3. 提取目标信息并整理成字典格式。
  • 详细步骤

    1. 发送HTTP请求以获取详情页HTML内容,并将其编码为UTF-8格式。
    2. 使用预定义的CSS选择器来定位页面上包含关键信息的元素。
    3. 将解析得到的HTML元素提取出文本信息,并按照指定的分隔符连接成一个长字符串。
    4. 使用自定义的函数extract_text_between_patterns从长字符串中提取出具体信息,并整理成字典格式。
    5. 最后,返回包含关键信息的字典。
  • 关键函数

    • extract_text_between_patterns:从长字符串中提取出具体信息的函数,它根据指定的起始和结束模式来匹配文本,并返回匹配的结果列表。
  • 返回值

    • 一个字典,包含部首、画数、音读み等关键信息。

3.保存JSON

通过循环遍历urllist中的每个汉字链接,然后调用get_detailed函数来获取每个汉字的详细信息。获取到的信息被打印输出,并且添加到了名为ans的列表中。

接着,将整个ans列表保存为一个JSON文件,以便将获取到的汉字详细信息持久化存储下来。JSON文件的保存路径为当前目录下的ans.json文件,并且使用UTF-8编码格式,以确保能够正确地保存包含非ASCII字符的内容。

ans = []
for chines in urllist:chines = get_detailed(chines)print(chines)ans.append(chines)# 将ans保存为json文件
with open('ans.json', 'w', encoding='utf-8') as f:json.dump(ans, f, ensure_ascii=False, indent=4)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/600957.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【分治算法】Strassen矩阵乘法Python实现

文章目录 [toc]问题描述基础算法时间复杂性 Strassen算法时间复杂性 问题时间复杂性Python实现 个人主页&#xff1a;丷从心. 系列专栏&#xff1a;Python基础 学习指南&#xff1a;Python学习指南 问题描述 设 A A A和 B B B是两个 n n n \times n nn矩阵&#xff0c; A A…

Android Studio导入第三方so库和jar包——Android Studio

导入so库 方式一&#xff08;libs文件夹&#xff09; 将项目以【Project】的结构显示&#xff0c;将目标架构对应的so文件夹&#xff08;如下图中 的arm64-v8a&#xff09;复制粘贴到app文件下的lib文件夹中&#xff08;如下图的步骤1 2 3&#xff09; 在build.gradle&…

应用方案 | D431L可调精密基准源

概述 D431L是一种低压三端可调稳压器&#xff0c;保证在适用温度范围内的热稳定性。输出电压可以设置为VREF(约1.24V)~16V&#xff08;接两个外部电阻&#xff09;。该装置具有典型的动态输出0.2Ω的阻抗。在很多应用中&#xff0c;可替代齐纳二极管。 D431L有TO-92和SOT23封装…

JVM高级篇之GC

文章目录 版权声明垃圾回收器的技术演进ShenandoahShenandoah GC体验Shenandoah GC循环过程 ZGCZGC简介ZGC的版本更迭ZGC体验&使用ZGC的参数设置ZGC的调优 版权声明 本博客的内容基于我个人学习黑马程序员课程的学习笔记整理而成。我特此声明&#xff0c;所有版权属于黑马…

[Windows] Wireshark v3.6.1 【网络抓包工具】

Wireshark是世界上最流行的网络分析工具。 这个强大的工具可以捕捉网络中的数据&#xff0c;并为用户提供关于网络和上层协议的各种信息。与很多其他网络工具一样&#xff0c;Wireshark也使用pcap network library来进行封包捕捉。 Wireshark的优势&#xff1a;- 绿色版免安…

Excel 文件底部sheet 如何恢复

偶然打开一个excel文件&#xff0c;惊奇地发现&#xff1a;原来excel文件底部的若干个sheet居然全都看不到了。好神奇啊。 用其它的电脑打开同样的excel文件&#xff0c;发现&#xff1a;其实能看到的。说明这个excel文件并没有被损坏。只要将修改相关设置。就可以再次看…

h5 笔记3 多媒体素材运用

关于电影编码 我们经常用扩展名来判断文件的类型&#xff0c;但是对于影音文件未必适用&#xff0c;影音文件的文件格式(container)和编码(codec)之间并非绝对相关。决定影音文件播放的关键在于浏览器是否含有适合的影音编解码技术。 笔记来源&#xff1a; ©《HTML5CSS3J…

SpringFramework实战指南(八)

SpringFramework实战指南&#xff08;八&#xff09; 5.1 场景设定和问题复现5.2 解决技术代理模式 5.1 场景设定和问题复现 准备AOP项目 项目名&#xff1a;spring-aop-annotation pom.xml <dependencies><!--spring context依赖--><!--当你引入Spring Conte…

图像识别网络与训练策略——基于经典网络架构训练图像分类模型

基于经典网络架构训练图像分类模型 总体框架 数据预处理部分&#xff1a;- 数据增强&#xff1a;torchvision中transforms模块自带功能&#xff0c;比较实用 - 数据预处理&#xff1a;torchvision中transforms也帮我们实现好了&#xff0c;直接调用即可 - DataLoader模块直接…

小小算式(1 + 2) * (3 + 4)背后的大道理

目录 前缀表示法&#xff08;波兰表达式&#xff09; 中缀表达法 后缀表达法&#xff08;逆波兰表达式&#xff09; 三种表达法的相互转换 练习&#xff1a;逆波兰表达式求值 前缀表示法&#xff08;波兰表达式&#xff09; 波兰表示法&#xff08;英语&#xff1a;Polis…

【二分查找】Leetcode 寻找旋转排序数组中的最小值

题目解析 153. 寻找旋转排序数组中的最小值 我们可以发现旋转后的数组是有这样一个顺序特征&#xff1a; 1.要么是旋转长度次&#xff0c;刚好还是原来的数组 2.要么一定存在一段一段的升序区间&#xff0c;再其中一段的升序区间中就存在最小值 算法讲解 但是我们这一次使用…

代码随想录阅读笔记-二叉树【修剪二叉搜索树】

题目 给定一个二叉搜索树&#xff0c;同时给定最小边界L 和最大边界 R。通过修剪二叉搜索树&#xff0c;使得所有节点的值在[L, R]中 (R>L) 。你可能需要改变树的根节点&#xff0c;所以结果应当返回修剪好的二叉搜索树的新的根节点。 思路 相信看到这道题目大家都感觉是…