位置: IT常识 - 正文

Java如何解析html里面的内容并存到数据库(java如何解析json字符串)

编辑:rootadmin
Java如何解析html里面的内容并存到数据库 一、前言

推荐整理分享Java如何解析html里面的内容并存到数据库(java如何解析json字符串),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:java如何解析xml字符串,java如何解析json字符串,java如何解析byte数组,java如何解析xml字符串,Java如何解析xml,java如何解析xml字符串,java如何解析xml字符串,java如何解析xml字符串,内容如对您有帮助,希望把文章链接给更多的朋友!

        最近接到一个任务,需要爬取五级行政区划的所有数据(大概71万条数据在),需要爬取的网站:行政区划 - 行政区划代码查询 发现这个网站不是用接口请求的,而且直接返回html代码,所以,去看了一下Java是如何解析html里面的内容

二、准备工作

        我选用的是使用jsoup进行html的读取和解析,需要加入如下依赖:

<dependency> <groupId>org.jsoup</groupId> <artifactId>jsoup</artifactId> <version>1.8.3</version> </dependency>

        jsoup 是一款 Java 的HTML 解析器,可直接解析某个URL地址、HTML文本内容。它提供了一套非常省力的API,可通过DOM,CSS以及类似于jquery的操作方法来取出和操作数据。它是基于MIT协议发布的。

        jsoup的主要功能如下:

        1、从一个URL,文件或字符串中解析HTML;

        2、使用DOM或CSS选择器来查找、取出数据;

        3、可操作HTML元素、属性、文本; 

        示例代码:

//获取html的文档对象Document doc = Jsoup.parse("http://www.dangdang.com");//获取页面下id="content"的标签Element content = doc.getElementById("content");//获取页面下的a标签Elements links = content.getElementsByTag("a");for (Element link : links) { //获取a标签下的href的属性值 String linkHref = link.attr("href"); //获取a标签下的文本内容 String linkText = link.text();}

        Elements这个对象提供了一系列类似于DOM的方法来查找元素,抽取并处理其中的数据。具体如下:

        1、查找元素

        getElementById(String id)

        getElementsByTag(String tag)

        getElementsByClass(String className)

        getElementsByAttribute(String key) (and related methods)

        Element siblings: siblingElements(), firstElementSibling(), lastElementSibling();nextElementSibling(), previousElementSibling()

        Graph: parent(), children(), child(int index)

        2、元素数据

        attr(String key)获取属性

Java如何解析html里面的内容并存到数据库(java如何解析json字符串)

        attr(String key, String value)设置属性

        attributes()获取所有属性

        id(), className() and classNames()

        text()获取文本内容

        text(String value) 设置文本内容

        html()获取元素内

        HTMLhtml(String value)设置元素内的HTML内容

        outerHtml()获取元素外HTML内容

        data()获取数据内容(例如:script和style标签)

        tag() and tagName()

        3、操作HTML和文本

        append(String html), prepend(String html)

        appendText(String text), prependText(String text)

        appendElement(String tagName), prependElement(String tagName) html(String value)

三、开始爬取网站数据

        直接上代码:

        Test.java:

@Slf4j@SpringBootTestclass Test { @Resource private PositionService positionService; /** * 爬取省市区网站 */ @Test public void test2() throws InterruptedException { //一共五级 for (int i = 0 ; i < 5 ; i++) { if (i == 0) { List<PositionEntity> positionEntities = PositionUtils.reqPosition(PositionUtils.URL_HEAD); savePosition(positionEntities, null, i); continue; } List<Position> positions = positionService.findListByLevel(i); for (Position parentPosition : positions) { List<PositionEntity> positionEntities = PositionUtils.reqPosition(String.format("%s%s%s", PositionUtils.URL_HEAD, parentPosition.getSn(), PositionUtils.URL_TAIL)); savePosition(positionEntities, parentPosition, i); } } } /** * 报错地址信息 */ private void savePosition(List<PositionEntity> positionEntities, Position parentPosition, int i){ for (PositionEntity entity : positionEntities) { Position position = new Position(); position.setSn(entity.getCode()); position.setFullInitials(PinyinUtils.strFirst2Pinyin((parentPosition != null ? parentPosition.getFullName() : "")+entity.getName())); position.setFullName((parentPosition != null ? parentPosition.getFullName() : "")+entity.getName()); position.setLevel(i + 1); position.setName(entity.getName()); position.setOrderNumber(0); position.setPsn(parentPosition != null ? parentPosition.getSn() : 0L); long count = positionService.countBySn(position.getSn()); if (count == 0) { positionService.savePosition(position); } } }}

         PositionService.java:

public interface PositionService { void savePosition(Position position); long countBySn(Long sn); List<Position> findListByLevel(Integer level);}

         PositionServiceImpl.java:

@Servicepublic class PositionServiceImpl extends ServiceImpl<PositionMapper, Position> implements PositionService { @Override public void savePosition(Position position) { baseMapper.insert(position); } @Override public long countBySn(Long sn) { return baseMapper.selectCount(new QueryWrapper<Position>().lambda().eq(Position::getSn, sn)); } @Override public List<Position> findListByLevel(Integer level) { return baseMapper.selectList(new QueryWrapper<Position>().lambda().eq(Position::getLevel, level)); }}

        PositionMapper.java:

@Repositorypublic interface PositionMapper extends BaseMapper<Position> {}

        Position.java:

@Data@TableName("position")@EqualsAndHashCode()public class Position implements Serializable { @TableId(type = IdType.AUTO) private Integer id; /** * 编码 */ private Long sn; /** * 上级地址编码 */ private Long psn; /** * 名称 */ private String name; /** * 简称 */ private String shortName; /** * 层级 */ private Integer level; /** * 区号 */ private String code; /** * 邮政编码 */ private String zip; /** * 拼音 */ private String spell; /** * 拼音首字母 */ private String spellFirst; /** * 地址全名 */ private String fullName; /** * 地址全名拼音首字母 */ private String fullInitials; /** * 排序 */ private Integer orderNumber;}

        PositionMapper.xml:

<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"><mapper namespace="com.wkf.workrecord.dao.PositionMapper"></mapper>

        PositionUtils.java:

public class PositionUtils { public final static String URL_HEAD = "https://xingzhengquhua.bmcx.com/"; public final static String URL_TAIL = "__xingzhengquhua/"; public static List<PositionEntity> reqPosition(String url) throws InterruptedException { String htmlStr = HttpUtils.getRequest(url); //解析字符串为Document对象 Document doc = Jsoup.parse(htmlStr); //获取body元素,获取class="fc"的table元素 Elements table = doc.body().getElementsByAttributeValue("bgcolor", "#C5D5C5"); //获取tbody元素 Elements children; children = table.first().children(); //获取tr元素集合 Elements tr = children.get(0).getElementsByTag("tr"); List<PositionEntity> result = new ArrayList<>(); //遍历tr元素,获取td元素,并打印 for (int i = 3; i < tr.size(); i++) { Element e1 = tr.get(i); Elements td = e1.getElementsByTag("td"); if (td.size() < 2) { break; } String name = td.get(0).getElementsByTag("td").first().getElementsByTag("a").text(); String code = td.get(1).getElementsByTag("td").first().getElementsByTag("a").text(); if (CheckUtils.isEmpty(name) || CheckUtils.isEmpty(code)) { continue; } result.add(new PositionEntity(name, Long.parseLong(code))); } //防止ip被封 Thread.sleep(10000); return result; }}

        PinyinUtils.java:

public class PinyinUtils {private final static HanyuPinyinOutputFormat format = new HanyuPinyinOutputFormat();static {format.setCaseType(HanyuPinyinCaseType.LOWERCASE);format.setToneType(HanyuPinyinToneType.WITHOUT_TONE);format.setVCharType(HanyuPinyinVCharType.WITH_V);}/** * 字符串转拼音 * * @param str * 中文字符串 * @param fill * 分隔符 * @return 返回中文的拼音串 */public static String str2Pinyin(String str, String fill) {if (null == str) {return null;}try {StringBuilder sb = new StringBuilder();if (fill == null)fill = "";boolean isCn = true;for (int i = 0; i < str.length(); i++) {char c = str.charAt(i);if (i > 0 && isCn) {sb.append(fill);}if (c == ' ') {sb.append(fill);}// 1、判断c是不是中文if (c >= '\u4e00' && c <= '\u9fa5') {isCn = true;String[] piyins = PinyinHelper.toHanyuPinyinStringArray(c, format);if (null == piyins || 0 >= piyins.length) {continue;}sb.append(piyins[0]);} else {// 不是中文if (c >= 'A' && c <= 'Z') {sb.append((char)(c + 32));} else {sb.append(c);}isCn = false;}}return sb.toString();} catch (BadHanyuPinyinOutputFormatCombination e) {e.printStackTrace();}return null;}/** * 拼音首字母 * * @param str * 中文字符串 * @return 中文字符串的拼音首字母 */public static String strFirst2Pinyin(String str) {if (null == str) {return null;}try {StringBuilder sb = new StringBuilder();for (int i = 0; i < str.length(); i++) {char c = str.charAt(i);// 1、判断c是不是中文if (c >= '\u4e00' && c <= '\u9fa5') {String[] piyins = PinyinHelper.toHanyuPinyinStringArray(c, format);if (null == piyins || 0 >= piyins.length) {continue;}sb.append(piyins[0].charAt(0));} else {// 不是中文if (c >= 'A' && c <= 'Z') {sb.append((char)(c + 32));} else {sb.append(c);}}}return sb.toString();} catch (BadHanyuPinyinOutputFormatCombination e) {e.printStackTrace();}return null;}}
本文链接地址:https://www.jiuchutong.com/zhishi/299262.html 转载请保留说明!

上一篇:不仅仅是ChatGPT:分享一些AI时代的有力工具(不仅仅是喜欢原唱)

下一篇:【学姐面试宝典】—— 前端基础篇Ⅰ(HTTP/HTML/浏览器)(面试学弟学妹问题)

  • 荣耀60处理器是什么型号(荣耀60处理器是多大的)

    荣耀60处理器是什么型号(荣耀60处理器是多大的)

  • 荣耀30有红外遥控功能吗(荣耀30有红外遥控吗)

    荣耀30有红外遥控功能吗(荣耀30有红外遥控吗)

  • 快手为什么看不到别人的动态呢(快手为什么看不到谁浏览我的作品)

    快手为什么看不到别人的动态呢(快手为什么看不到谁浏览我的作品)

  • 华为p30是5g手机还是4g手机(华为p50e是5g手机吗)

    华为p30是5g手机还是4g手机(华为p50e是5g手机吗)

  • 手机烧屏是保修范围之内的吗(手机烧屏保修免费吗)

    手机烧屏是保修范围之内的吗(手机烧屏保修免费吗)

  • 华为手表gt2e可以接打电话吗(华为手表GT2e可以接打电话吗)

    华为手表gt2e可以接打电话吗(华为手表GT2e可以接打电话吗)

  • 群主如何知道谁退出了(群聊的群主怎么看是谁)

    群主如何知道谁退出了(群聊的群主怎么看是谁)

  • 手机上删除照片icloud会删除(手机上删除照片找回)

    手机上删除照片icloud会删除(手机上删除照片找回)

  • 海康摄像头激活失败什么原因(海康摄像头激活错误2015什么意思)

    海康摄像头激活失败什么原因(海康摄像头激活错误2015什么意思)

  • 小米10屏幕不清晰(小米10屏幕不清楚)

    小米10屏幕不清晰(小米10屏幕不清楚)

  • 苹果手机只有2g网络怎么办(苹果手机只有2g信号怎么回事)

    苹果手机只有2g网络怎么办(苹果手机只有2g信号怎么回事)

  • 三星电视每隔几分钟屏保(三星电视使用)

    三星电视每隔几分钟屏保(三星电视使用)

  • 美团申请退款红包还在不在(美团申请退款红包和卡券会退吗)

    美团申请退款红包还在不在(美团申请退款红包和卡券会退吗)

  • 斗鱼特别关注怎么设置(斗鱼 特别关注)

    斗鱼特别关注怎么设置(斗鱼 特别关注)

  • vivo怎么用sd卡的内存(vivo 怎么用sd卡)

    vivo怎么用sd卡的内存(vivo 怎么用sd卡)

  • 手机hd是什么意思啊收费吗(oppo手机hd是什么意思)

    手机hd是什么意思啊收费吗(oppo手机hd是什么意思)

  • 苹果x能反向充电吗(苹果x反向充电哪里开启)

    苹果x能反向充电吗(苹果x反向充电哪里开启)

  • 三星手机怎么截屏图片(三星手机怎么截屏)

    三星手机怎么截屏图片(三星手机怎么截屏)

  • 第一弹和那个软件差不多(第一弹app又可以使用了)

    第一弹和那个软件差不多(第一弹app又可以使用了)

  • 苹果的时间规划局在哪里(苹果的时间规划怎么设置)

    苹果的时间规划局在哪里(苹果的时间规划怎么设置)

  • 苹果xs像素多少万(苹果12pro像素是多少)

    苹果xs像素多少万(苹果12pro像素是多少)

  • 快应用中心是什么软件(快应用中心是什么鬼)

    快应用中心是什么软件(快应用中心是什么鬼)

  • 苹果扣费项目在哪个里面关(苹果扣费项目在哪里找)

    苹果扣费项目在哪个里面关(苹果扣费项目在哪里找)

  • 怎么双向清除聊天记录(怎么双向清除聊天记录微信)

    怎么双向清除聊天记录(怎么双向清除聊天记录微信)

  • 自己发的抖音怎么看不到(自己发的抖音怎么去水印)

    自己发的抖音怎么看不到(自己发的抖音怎么去水印)

  • wps表格打印预览快捷键是(wps表格打印预览显示不全怎么设置)

    wps表格打印预览快捷键是(wps表格打印预览显示不全怎么设置)

  • qq飞车实名认证怎么解除(qq飞车实名认证怎么解除绑定)

    qq飞车实名认证怎么解除(qq飞车实名认证怎么解除绑定)

  • 三星手机回收站清空怎么恢复(三星手机回收站怎么彻底删除)

    三星手机回收站清空怎么恢复(三星手机回收站怎么彻底删除)

  • msstdfmt.dll.是什么文件(msutb.dll)

    msstdfmt.dll.是什么文件(msutb.dll)

  • 华为nove5i什么时候上市(nove5什么时候出的)

    华为nove5i什么时候上市(nove5什么时候出的)

  • 苹果airpods怎么关机(苹果airpods怎么用)

    苹果airpods怎么关机(苹果airpods怎么用)

  • 织梦信息发布员发表文章后自动审核更新生成HTML(织梦如何使用)

    织梦信息发布员发表文章后自动审核更新生成HTML(织梦如何使用)

  • 城建税的计税依据是增值税和消费税的和吗
  • 转出未交增值税最终怎么转平
  • 借款合同印花税税率2023
  • 利润表季度怎么填写
  • 劳务费达到多少钱需要招标
  • 与收益相关的政府补助会计分录总额法
  • 计算产品当月生产成本
  • 汇票本票的区别
  • 固定资产报废变卖收入缴税账务处理
  • 盈余公积转增资本有限制吗
  • 小规模纳税人月超10万季度不超30万
  • 印花税本月没有,忘记零申报,有影响吗了
  • 财务付款制度及流程图
  • 亏损企业所得税汇算清缴怎么做
  • 会计所得税和税法所得税
  • 认证过的发票
  • 机器人销售属于什么行业
  • 出口布料有退税吗
  • 新版edge浏览器极速模式
  • 穿越火线真人版宣传片
  • 股东能随便提走入账资金吗
  • 零售环节的金银首饰需征收增值税吗
  • gws.exe是啥
  • linux命令行怎么用
  • 上市公司转让股票所得要交个税吗?
  • 特许权使用费属于无形资产吗
  • 网络通信的整个流程
  • 蜜蜂 (© Angela Parker/Offset)
  • 实物资产的管理
  • 上月未结账本月不能操作任何业务
  • php保存远程图片
  • 农业产品征税范围注释财税字[1995]52号a
  • vue中elementui怎么用
  • vue.js in action
  • js生成条形码的方式有哪些
  • 网络分割算法
  • conda操作
  • eltable数据多 卡
  • 电子产品报废清理是否缴纳教育附加税
  • 银行账户管理的直接责任人是共享中心核算会计
  • mysql5.7字符集
  • sql server如何操作
  • 采用公允价值模式计量的投资性房地产处置
  • 银行汇票背书
  • 投资收益账户属于所有者权益类吗
  • 捐赠 税收
  • 核算产品的成本的表
  • 固定资产不可以搬走,那什么资产能搬走的?
  • 营改增政策汇总
  • 免费品尝活动广告语
  • 实报实销有补贴嘛
  • 购买发票打印机如何账务处理?
  • 收入的确认条件包括
  • 发票打印机多少钱一套
  • 私立幼儿园怎样转公立幼儿园
  • 台式电脑二级网页打不开怎么办
  • win7支持net.framework4.7.2
  • WIN10系统优化技巧
  • win10删除的文件恢复
  • windows打不开添加打印机
  • win7系统禁止更新
  • 批处理在windows中的典型应用
  • win7系统加内存条怎么设置
  • load its core dll
  • win8系统屏幕亮度调节
  • 时间服务器ip 端口
  • windows7没有桌面图标
  • 巨幕prime
  • ssh连不上centos
  • 肉鸡下的鸡蛋可以吃吗
  • cmd for /f
  • 安卓病毒查杀软件
  • 修改文件名ren
  • unity 内存管理
  • 严苛认证
  • 举例说明jquery的功能
  • brook javascript框架介绍
  • 云南地方税务局电话
  • 杭州地税局办事大厅
  • 大宗物流服务平台
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设