爬取日本常用汉字秘籍

前言

昨天投简历时遇到了这样的一个笔试。本以为会是数据结构算法之类的没想到直接发了一个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.text

css_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.text
        urllist.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.text
    css_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)+ separator

        font = {}
        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()
                    break
        return hanzi_dict

    # 测试
    patterns = ['部首', '画数', '音 読 み', '訓 読 み', '意味', '成 り 立 ち', '種別', '分類', '学年', '漢字 検定', 'JIS 水準']
    # 解析数据
    hanzi_dict = create_dict(results, patterns)
    # 遍历hanzi_dict
    for key, value in hanzi_dict.items():
        parts = hanzi_dict[key].split('%')
        parts.pop()  # 移除最后一个空字符串
        if  len(parts) == 1:
            hanzi_dict[key] = str(parts[0])
            continue
        hanzi_dict[key] = parts

    return 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)

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

计算机网络——38报文完整性

报文完整性 数字签名 数字签名类比于手写签名 发送方数字签署了文件&#xff0c;前提是他是文件的拥有者/创建者可验证性&#xff0c;不可伪造性&#xff0c;不可抵赖性 谁签署&#xff0c;接收方可以向他人证明是他&#xff0c;而不是其他人签署了这个文件签署了什么&#…

Web攻击越发复杂,企业如何保护云上业务

如今&#xff0c;电子政务、电子商务、网上银行、网上营业厅等依托Web应用&#xff0c;为广大用户提供灵活多样的服务。在这之中&#xff0c;流量攻击堪称是Web应用的最大敌人&#xff0c;黑客通过流量攻击获取利益、竞争对手雇佣黑客发起恶意攻击、不法分子通过流量攻击瘫痪目…

ShardingSphere-JDBC使用时出现雪花算法id无法生成

出现报错&#xff1a; 这是sql 尝试1&#xff1a; 这里改成Long 还是报错 尝试2&#xff1a;将配置重写 删除 props: # 主键生成器属性配置worker-id: 1 # Snowflake算法中的workerId配置解决&#xff01;

基于Difussion图像、视频生成综述

2024年大年初七&#xff08;02.16&#xff09;OpenAI 发布视频生成模型 Sora 在各大平台转疯了&#xff0c;和2022年发布ChatGPT3.5时一样的疯狂。在开工第一天&#xff0c;我就去官网上看了 Sora 的技术报告&#xff0c;遗憾的是&#xff0c;在这份技术报告中只披露了一些模型…

苹果证书分类及作用详解,助力开发者高效管理应用程序

转载&#xff1a;苹果证书的作用及分类详解 摘要&#xff1a;本文将详细介绍苹果证书的作用及分类&#xff0c;包括企业证书、开发者证书、 推送证书、分发证书和MDM证书&#xff0c;帮助开发者了解如何正确使用和管理这些证书&#xff0c; 提升应用程序的开发和发布效率。 引…

基于SSM的校园二手物品交易平台论文

摘 要 现代经济快节奏发展以及不断完善升级的信息化技术&#xff0c;让传统数据信息的管理升级为软件存储&#xff0c;归纳&#xff0c;集中处理数据信息的管理方式。本校园二手物品交易平台就是在这样的大环境下诞生&#xff0c;其可以帮助管理者在短时间内处理完毕庞大的数据…

基于单片机分舱式电开水炉位控制系统

**单片机设计介绍&#xff0c;基于单片机分舱式电开水炉位控制系统 文章目录 一 概要二、功能设计三、 软件设计原理图 五、 程序六、 文章目录 一 概要 基于单片机分舱式电开水炉位控制系统概要主要涉及通过单片机对电开水炉的各个舱位进行精确控制&#xff0c;实现水位、温度…

C++中的指针:其重要性与应用深度解析

在C编程语言的世界中&#xff0c;指针无疑是一个至关重要的概念。它不仅是C语言的核心特性之一&#xff0c;更是实现高效、灵活编程的关键工具。理解并熟练掌握指针的使用&#xff0c;对于提升程序设计能力、优化代码性能以及深入理解计算机内存模型具有不可估量的价值。 为了帮…

HarmonyOS 应用开发-ArkUI(ets)仿“腾讯新闻”APP

一、效果演示 1、新闻列表页 2、新闻详情页、图片展示页 3、视频页 4、动态页 二、 流程图 –本来自定义了视频的控制栏的&#xff0c;但是发现VideoController()控制器的bug会导致控制器失效&#xff0c;所以没继续做。视频页先不搞了。 三、文件组织&#xff08;“我的页面…

mac上搭建鸿蒙开发环境(2024)

开发环境 设备 MacBook Pro 芯片 Apple M1 系统 11.4 内存 16 GB 一、下载公开版本的DevEco Studio 华为官方目前对外提供的版本是DevEco Studio 3.1&#xff0c;可在官网下载https://developer.huawei.com/consumer/cn/deveco-studio/ 因为目前还在学习阶段&#xff0c;…

OpenHarmony实战:轻量系统STM32F407芯片移植案例

介绍基于STM32F407IGT6芯片在拓维信息Niobe407开发板上移植OpenHarmony LiteOS-M轻量系统&#xff0c;提供交通、工业领域开发板解决方案。 移植架构采用Board与SoC分离方案&#xff0c;使用arm gcc工具链Newlib C库&#xff0c;实现了lwip、littlefs、hdf等子系统及组件的适配…

循序表实战——基于循序表的通讯录

前言&#xff1a;本篇文章主要是利用顺序表作为底层&#xff0c; 实现一个通讯录。偏向于应用&#xff0c; 对于已经学习过c的友友们可能没有难度了已经。没有学习过c的友友&#xff0c; 如果顺序表不会写&#xff0c; 或者说没有自己实现过&#xff0c; 请移步学习顺序表相关内…

xgo: golang基于-toolexec实现猴子补丁

注&#xff1a; 转载请注明出处&#xff0c; 原文链接。 概述 在这篇博客中&#xff0c;我将详细介绍 xgo 的实现细节。 如果你不知道&#xff0c;xgo 项目位于 https://github.com/xhd2015/xgo。 它的作用很简单&#xff0c;就是在每个 Go 函数的开头添加拦截器&#xff0…

python-面向对象编程

面向对象编程 面向对象&#xff0c;python中支持两种编程方式&#xff0c;来写代码&#xff0c;分别是&#xff1a;函数式编程和面向对象 函数式&#xff1a; # 定义函数&#xff0c;在函数中实现功能 def func():print("一个NB的功能")面向对象 calss FOO(object):d…

git提交代码时报错,提不了

问题 今天在换了新电脑&#xff0c;提交代码时报错 ✖ eslint --fix found some errors. Please fix them and try committing again. ✖ 21 problems (20 errors, 1 warning) husky > pre-commit hook failed (add --no-verify to bypass) 解决 通过 --no-verify 解决&…

JavaScript - 请你说一说对随机数的理解

难度级别:初级及以上 提问概率:40% 在前端开发中,随机数的应用场景非常多,而且也是一个常见的考点。例如网页登录的验证码,看似只有4个随机数字加字母的组合,其实这也是随机数的范畴;例如在抽奖算法中,可以用随机数确定用户中奖的概率…

解决电脑无故自动关机或重启的15种方法,总有一种适合你

序言 你的Windows PC是否在没有警告的情况下关闭或重新启动?这背后有几个潜在的原因。例如,它可能是软件/硬件冲突、过热或硬盘驱动器错误。本故障排除指南将概述在Windows 10/11中修复自动关闭和重新启动的多个解决方案。 如果你的计算机经常关闭,则必须在安全模式下启动…

如何实现异地公网环境访问本地部署的支付宝沙箱环境调试支付SDK

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

Flutter如何集成到已有iOS工程上

大家好&#xff0c;我是咕噜铁蛋&#xff0c;今天我将和大家分享一个实用的技术教程——如何将Flutter集成到已有的iOS工程中。Flutter是Google推出的一款开源的移动UI框架&#xff0c;它允许开发者使用Dart语言来开发高性能、美观的原生应用&#xff0c;并支持iOS和Android两大…

DLDP简介

定义 设备链路检测协议DLDP&#xff08;Device Link Detection Protocol&#xff09;用来监控光纤或铜质双绞线&#xff08;例如超五类双绞线&#xff09;的链路状态。如果发现单向链路存在&#xff0c;DLDP协议会根据用户配置&#xff0c;自动关闭或通知用户手工关闭相关接口…