分2步。

1.从 HTML 中提取出纯文本(去掉标签)

import org.htmlparser.NodeFilter;
import org.htmlparser.Parser;
import org.htmlparser.beans.StringBean;
import org.htmlparser.filters.CssSelectorNodeFilter;
import org.htmlparser.util.NodeList;public class HtmlUtil {public static String getText(String html, String id) {try {Parser parser = new Parser(html);NodeFilter filter = new CssSelectorNodeFilter("#" + id);NodeList nList = parser.extractAllNodesThatMatch(filter);return nList == null || nList.size() == 0 ? null : nList.elementAt(0).toPlainTextString();} catch (Exception e) {e.printStackTrace();return null;}}public static String getTextByClass(String html, String css_class) {try {Parser parser = new Parser(html);NodeFilter filter = new CssSelectorNodeFilter("." + css_class);NodeList nList = parser.extractAllNodesThatMatch(filter);return nList == null || nList.size() == 0 ? null : nList.elementAt(0).toPlainTextString();} catch (Exception e) {e.printStackTrace();return null;}}/*** 获取网页中纯文本信息** @param html* @return* @throws Exception* @throws Exception*/public static String getText(String html) throws Exception {StringBean bean = new StringBean();bean.setLinks(false);bean.setReplaceNonBreakingSpaces(true);bean.setCollapse(true);// 返回解析后的网页纯文本信息Parser parser = Parser.createParser(html, "utf-8");parser.visitAllNodesWith(bean);parser.reset();String text = bean.getStrings();String reg = "[^\u4e00-\u9fa5]";text = text.replaceAll(reg, " ");return text;}
}

2.从纯文本中提取出中文关键字(TextRank关键词提取)

import com.hankcs.hanlp.HanLP;
import com.hankcs.hanlp.dictionary.stopword.CoreStopWordDictionary;
import com.hankcs.hanlp.seg.common.Term;import java.util.*;
import java.util.stream.Collectors;/*** TextRank关键词提取** @author hankcs*/
public class TextRankKeyword {public static final int MAX_KEY_WORDS = 7;/*** 阻尼系数(DampingFactor),一般取值为0.85*/static final float d = 0.618f;/*** 最大迭代次数*/static final int max_iter = 2000;static final float min_diff = 0.001f;public TextRankKeyword() {// jdk bug : Exception in thread "main" java.lang.IllegalArgumentException: Comparison method violates its general contract!System.setProperty("java.util.Arrays.useLegacyMergeSort", "true");}public String getKeyword(String title, String content) {List<Term> termList = HanLP.segment(title + content);List<String> wordList = new ArrayList<String>();for (Term t : termList) {if (shouldInclude(t)) {wordList.add(t.word);}}Map<String, Set<String>> words = new HashMap<String, Set<String>>();Queue<String> que = new LinkedList<String>();for (String w : wordList) {if (!words.containsKey(w)) {words.put(w, new HashSet<String>());}que.offer(w);if (que.size() > 5) {que.poll();}for (String w1 : que) {for (String w2 : que) {if (w1.equals(w2)) {continue;}words.get(w1).add(w2);words.get(w2).add(w1);}}}Map<String, Float> score = new HashMap<String, Float>();for (int i = 0; i < max_iter; ++i) {Map<String, Float> m = new HashMap<String, Float>();float max_diff = 0;for (Map.Entry<String, Set<String>> entry : words.entrySet()) {String key = entry.getKey();Set<String> value = entry.getValue();m.put(key, 1 - d);for (String other : value) {int size = words.get(other).size();if (key.equals(other) || size == 0) continue;m.put(key, m.get(key) + d / size * (score.get(other) == null ? 0 : score.get(other)));}max_diff = Math.max(max_diff, Math.abs(m.get(key) - (score.get(key) == null ? 0 : score.get(key))));}score = m;if (max_diff <= min_diff) break;}List<Map.Entry<String, Float>> entryList = new ArrayList<Map.Entry<String, Float>>(score.entrySet());Collections.sort(entryList, (o1, o2) -> (o1.getValue() - o2.getValue() > 0 ? -1 : 1));List<Map.Entry<String, Float>> list = entryList.stream().filter(w -> w.getKey().length() > 1).collect(Collectors.toList());String result = "";int nKeyword = MAX_KEY_WORDS > list.size() ? list.size() : MAX_KEY_WORDS;for (int i = 0; i < nKeyword; ++i) {result += list.get(i).getKey() + ';';}System.out.println(result);return result;}/*** 是否应当将这个term纳入计算,词性属于名词、动词、副词、形容词** @param term* @return 是否应当*/public boolean shouldInclude(Term term) {return CoreStopWordDictionary.shouldInclude(term);}
}

完整工程源代码:

https://github.com/KotlinSpringBoot/saber

附: 完整爬取各大著名技术站点的博客文章的源代码。

从爬取的文章 HTML 中提取出中文关键字相关推荐

  1. 爬取微信文章,用70行代码爬取了搜狗上666篇文章

    因为再看崔庆才的教程,刚好看到爬取微信文章,所以就想着自己试试.打开搜狗发现,搜狗的微信文章页面网页布局有了变化(准确来说是简单了一点). 所以分析了一下,用了70行代码实现了爬取上面['搞笑', ' ...

  2. copy outerHTML、python爬取csdn文章、一键打包个人csdn文章保存到本地

    文章目录 1copy outerHTML复制网站源码法 1.1复制源码 1.2 遇到的问题 2 python爬取CSDN博客文章(保存为html,txt,md) 2.1 安装依赖 2.2 完整代码 3 ...

  3. Python爬取了《雪中悍刀行》数据,数据可视化分析

    Python爬取了<雪中悍刀行>数据,数据可视化分析 如何查找视频id 项目结构 制作词云图 制作最近评论数条形图与折线图 制作每小时评论条形图与折线图 制作最近评论数饼图 制作每小时评论 ...

  4. python贴吧爬虫-Python 爬虫练习: 爬取百度贴吧中的图片

    背景:最近开始看一些Python爬虫相关的知识,就在网上找了一些简单已与练习的一些爬虫脚本 实现功能:1,读取用户想要爬取的贴吧 2,读取用户先要爬取某个贴吧的页数范围 3,爬取每个贴吧中用户输入的页 ...

  5. Python爬虫:输入公司名称,爬取企查查网站中的公司信息

    前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,如有问题请及时联系我们以作处理. 以下文章来源于Python爬虫数据分析挖掘 ,作者:李运辰 根据输入的公司名称来爬取企查查网 ...

  6. 案例:爬取豆瓣电影Top250中的电影信息

    案例:爬取豆瓣电影Top250中的电影信息 豆瓣电影Top250首页 分析请求地址 在豆瓣电影Top250首页的底部可以确定电影信息一共有10页内容,每页25个电影信息,如下图: 切换页面,可以看到浏 ...

  7. 爬取腾讯新闻中省份疫情数据到Mysql数据库

    爬取腾讯新闻中省份疫情数据到Mysql数据库 本人是一个中职学生,第一次发表自己所学到技术-- 本篇文章所用到的语言及工具等: python 3.8 pycharm Mysql Navicat Pre ...

  8. 教你如何使用Java代码从网页中爬取数据到数据库中——网络爬虫精华篇

    文章目录 1:网络爬虫介绍 2:HttpClients类介绍 2.1 HttpGet参数问题 2.2 HttpPost参数问题 2.3 连接池技术问题 3:Jsoup介绍 4:动手实践如何抓取网页上数 ...

  9. Python爬取豆瓣Top250电影中2000年后上映的影片信息

    Python爬取豆瓣Top250电影中2000年后上映的影片信息 前言 双十一前加在京东购物车的一个东西,价格330,Plus会员用券后差不多310.双十一当天打开看了下399,还得去抢满300减10 ...

最新文章

  1. python 3.5 3.6 3.7_选择 Python3.6 还是 Python 3.7
  2. jzoj6305-最小值【线段树,dp,双端链表】
  3. opencv 二值化_Python-OpenCV获取图像轮廓的图像处理方法
  4. 疫情与资本寒冬双重危机下,智领云为何能拿到数千万融资?
  5. .net byte转java byte_CVE20200688的武器化与.net反序列化漏洞那些事
  6. 避免unicode字符被截断的方法
  7. jenkins持续化集成中注意的3个小问题
  8. 空间变量php,PHP名称空间可以包含变量吗?
  9. 第三方支付易宝支付的具体实现
  10. linux gmac驱动分析,以太网驱动流程浅析(一)-ifconfig主要流程
  11. 物联网技术,主要应用在哪些领域?
  12. java上下载的ex表格打不开怎么回事_Java 下载 Excel文件打不开
  13. WP博客几款好看的图片类模板分享
  14. Hack The Box - Access Writeup
  15. 一键非自锁开关电路设计
  16. 虚拟机安装Ubuntu16.04.6
  17. c++windows openSSL编译(ActivePerl-5.28.msi+openssl-1.1.1k)
  18. 电源附近的电容的作用分析
  19. 计算机科学专业的五种高薪职业选择,看看你适合哪种?
  20. LATEX——两张图并列排列/双栏模板中图片通栏并列布局

热门文章

  1. Does taro support react hook?
  2. 测试博客园代码插入格式显示
  3. 创新性应用深度学习,IBM在语音识别领域取得了里程碑式突破
  4. bootstrapValidator对于隐藏域验证和程序赋值即时验证的问题
  5. 学习编程的条件是什么?
  6. Java classLoader【转】
  7. WSS 3.0 and MOSS 2007 SP2 发布
  8. 关于软件系统维护的一点想法
  9. flink streamGraph生成
  10. idea 启动选择profiles_玩转SpringBoot 2 之项目启动篇