启发式提取一个网页的主体内容

免费开源网页内容提取工具mcp-server-scraper:让AI助手直接“阅读”网页 网页内容提取是数据采集和自动化处理中的基础技术,其核心原理是通过HTTP请求获取HTML文档,再通过解析算法识别并提取主体内容。这项技术的价值在于将非结构化的网页信息转化为结构化数据,为下游应用提供干净的输入。在实际工程中,开发者常面临付费API成本高、格式解析复杂等挑战。针对AI助手工作流中的网页分析需求,开源项目mcp-server-scraper应运而生。该项目基于Mozilla Readability引擎,能智能剥离广告、导航栏等干扰元素,将网页内容转换为纯净的Markdown格式。通过集成Mode 阅读详情

http://www.smallqiao.com/124099.html

对于一个网页来说,一般都会有非常丰富的边框或导航条信息,但是用户往往比较专注于主题内容,边框内容可以说是没有太大价值的。尤其是对于手持设备来说,显示大量的边框信息将变得非常讨厌。在搜索引擎中,其实只要搜索引网页的主题内容,对于边框内容的索引意义不大。

上面说了一下提取一个网页主体内容的作用,下面来讨论一下方法。如果真要准确地提取一个网页的主题将非常困难,因为网页的结构多种多样,如果要做到程序自动化提取还是有一定困难的。

在网上看资料的时候,看到一篇文章http://w-shadow.com/blog/2008/01/25/extracting-the-main-content-from-a-webpage/,讲述了如何基于启发式提取网页内容,还有php实现的代码。

我们知道对于导航信息来说,一般是都是一些链接,那么网页中的链接文本的占比程度就会比较高,我们只要去除这些链接占比程度比较高的文本,就基本可以去除这些丰富的边框信息了。

下面是我用C#实现的代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using Sgml;
using System.IO;
 
namespace Soso.Youwang
{
 
    class HtmlMainContentExtractor
    {
        private HashSet<string> containerTags = new HashSet<string>() { "div", "table", "td", "th", "tbody", "thead", "tfoot", "col", "colgroup", "ul", "ol", "html", "center", "span", "form" };
        private HashSet<string> removeTags = new HashSet<string>() { "script", "noscript", "style", "meta", "input", "iframe", "embed", "hr", "img", "#comment", "link", "label" };
        private HashSet<string> igonoreLenTags = new HashSet<string>() { "span" };
 
        /// <summary>
        /// 链接文本的长度
        /// </summary>
        private int totalLinkLen = 0;
        /// <summary>
        /// 总的文本的长度
        /// </summary>
        private int totalLen = 0;
 
        /// <summary>
        /// 链接度,是平均的多少倍以上就删除
        /// </summary>
        private double rate = 1.1;
 
        /// <summary>
        /// 平均链接度
        /// </summary>
        private double avgLinkRate;
 
        /// <summary>
        /// 小于一定字符数的container将被删除
        /// </summary>
        private int minLen = 20;
 
        public String Extract(string html)
        {
            html = html.ToLower();
            XmlDocument doc = ConvertHtml2Xhtml(html);
            HeuristicRemove(doc.DocumentElement);
            avgLinkRate = 1.0 * totalLinkLen / totalLen;
            int total, link;
            ContainerRemove(doc.DocumentElement, out total, out link);
            return doc.OuterXml;
 
        }
 
        private bool ContainerRemove(XmlNode node, out int total, out int link)
        {
            total = 0;
            link = 0;
            List<xmlnode> toRemove = new List<xmlnode>();
            foreach (XmlNode el in node.ChildNodes)
            {
                int t;
                int l;
                if (ContainerRemove(el, out t, out l))
                {
                    toRemove.Add(el);
                }
                else
                {
                    total += t;
                    link += l;
                }
            }
 
            foreach (XmlNode el in toRemove)
            {
                node.RemoveChild(el);
            }
 
            if (containerTags.Contains(node.Name))
            {
                if ((!igonoreLenTags.Contains(node.Name) && total <= minLen) || 1.0 * link / total >= rate * avgLinkRate)
                {
                    return true;
                }
            }
            else if (node.NodeType == XmlNodeType.Text)
            {
                total += node.Value.Length;
            }
            else if (node.Name == "a")
            {
                link += node.InnerText.Length;
            }
            return false;
        }
 
        private bool HeuristicRemove(XmlNode node)
        {
            if (removeTags.Contains(node.Name))
            {
                return true;
            }
            List<xmlnode> toRemove = new List<xmlnode>();
            foreach (XmlNode el in node.ChildNodes)
            {
                if (HeuristicRemove(el))
                {
                    toRemove.Add(el);
                }
            }
            foreach (XmlNode el in toRemove)
            {
                node.RemoveChild(el);
            }
 
            if (node.Name == "a")
            {
                totalLinkLen += node.InnerText.Length;
            }
            else if (node.NodeType == XmlNodeType.Text)
            {
                totalLen += node.Value.Length;
            }
            return false;
        }
 
        private XmlDocument ConvertHtml2Xhtml(string html)
        {
            using (SgmlReader reader = new SgmlReader())
            {
                reader.DocType = "HTML";
                reader.InputStream = new StringReader(html);
                using (StringWriter stringWriter = new StringWriter())
                {
                    using (XmlTextWriter writer = new XmlTextWriter(stringWriter))
                    {
                        reader.WhitespaceHandling = WhitespaceHandling.None;
                        writer.Formatting = Formatting.Indented;
                        XmlDocument doc = new XmlDocument();
                        doc.Load(reader);
                        return doc;
                    }
                }
            }
        }
    }
}


 

代码中用到了一个将html正规化,然后转成xml的一个工具:SgmlReaderDll。

整个工程代码,请点这里。


 




 

Creative Commons License

本文基于署名 2.5 中国大陆许可协议发布,欢迎转载,演绎或用于商业目的,但是必须保留本文的署名小桥流水(包含链接)。如您有任何疑问或者授权方面的协商,请给我发邮件。

 

从零开发Chrome插件:一键将网页内容转为Markdown文件 在Web开发和日常信息管理中,内容格式转换是一个常见需求,尤其是将网页内容转换为结构化的Markdown格式。其核心原理在于解析网页的DOM结构,通过选择器定位目标内容节点,并利用规则引擎将HTML标签映射为Markdown语法。这项技术的价值在于极大地提升了内容保存、整理和分发的效率,避免了手动排版的繁琐。典型的应用场景包括保存在线技术文档、博客文章、论坛讨论以及AI对话记录。本文聚焦于一个具体实践:开发一个名为“ChatGPT To Markdown”的浏览器插件。该插件通过内容脚本抓取网页DOM,结合 阅读详情

相关推荐

Python网页信息提取库Trafilatura实战应用

在现代网络数据采集系统中,高效、准确地从结构复杂且噪声繁多的网页中提取出有效正文内容是一项极具挑战的任务。传统基于正则表达式或简单DOM遍历的方法虽然具备一定的通用性,但在面对不同网站布局、动态加载机制以及多语言环境时往往力不从心。为此,应运而生——它是一个专为自动化文本提取设计的轻量级Python库,其目标是实现高精度的内容识别与结构化输出,同时兼顾性能与可扩展性。与其他主流提取工具相比,

weixin_28721743的博客 3332

(5)数据库—----单行函数—------字符函数、数学函数、日期函数

月薪100,奖金率为120%; select 100*1.2; select 100+(100*0.2); 年薪=月薪*12+奖金; IFNULL(expr1,expr2) 是判断字段是否为空,如果为空则返回指定字段 select salary from employees where salary*12+commission_pct; !!!!@@@!!!@@@!!!@@@!! ...

weixin_44847304的博客 1万+

Xilinx MCB

Xilinx DDR2核MCB的使用,项目中用到两个DDR2做乒乓,用一个PLL驱动两个MCB

JAVA NIO

转载请注明出处:https://i.cnblogs.com/EditPosts.aspx?opt=1 我们在学习的过程中可以形成自己的代码库,即将一些常用的类,函数,接口,配置文件等单独拎出来,下次使用时直接复制过来,这样就可以重复造轮子,早点下班回家。 java NIO是一个高效的处理文件的API, 比传统文件流要高效许多。 public class MyFileTools { ...

weixin_33751566的博客 1144

别让PEX和后仿真拖后腿:Calibre与Virtuoso ADE联调的那些‘坑’与最佳实践

本文深入探讨了Calibre与Virtuoso ADE在PEX寄生参数提取和后仿真联调中的常见问题与解决方案。针对DRC/LVS验证通过后出现的网表导入错误和仿真波形异常,提供了七大典型场景的实战经验,包括PEX提取模式选择、CalibreView生成细节、环境变量配置等关键环节的最佳实践,助力工程师高效完成芯片设计验证。

weixin_33695450的博客 393

物理与工程中的‘黑话’:Kronecker delta和Levi-Civita符号到底简化了什么?

本文深入解析了物理与工程中常用的Kronecker delta和Levi-Civita符号的简化作用。通过对比传统表示与张量表示,展示了这些符号在向量运算、矩阵迹计算及流体力学模拟中的高效应用,显著提升计算效率和代码可读性。特别适合理论物理和工程数学领域的学习者与从业者。

weixin_27215403的博客 397

【kd-tree】bzoj3489 A simple rmq problem

Orz zyf教给蒟蒻做法   蒟蒻并不会这题正解……(可持久化树套树?。。。Orz   对于每个点,我们可以求出pre[i],nex[i],那么询问的答案就是:求max (a[i]),其中 i 满足(pre[i]<qlandnex[i]>qrandi∈[ql,qr])   然后我们以(i,pre[i],nex[i])为坐标……将所有点抽象到三维空间中,每次查询就相当...

weixin_33751566的博客 2085

【Tessent Shell Users Manual】【Ch3】Design Introspection and Editing(未完待续)

Tessent Shell 提供了一系列用于检查(examining/introspecting)和编辑design的命令。

Tranquil_ovo的博客 1731

[Tool] Memory leak & performance profiling tools for C# / C++

For C++: Memory analysis tools: 1. C++ memory leak detector - Memory Validator (http://www.softwareverify.com/index.html) 2. Other as references: Purify from IBM Performance profiling tool...

weixin_33751566的博客 935

STM32G0定时器中断实战:HAL库配置TIM2实现精准1秒LED闪烁(附完整代码)

本文深入解析了STM32G0系列微控制器中定时器中断的配置与应用,重点介绍了如何使用HAL库配置TIM2实现精准的1秒LED闪烁。通过详细讲解时钟树分析、预分频系数与自动重装载寄存器的计算原理,并结合CubeMX图形化配置与完整代码示例,帮助开发者从底层理解定时器工作机制,掌握可复用的工程化配置方法。

weixin_29194817的博客 253

【AI就业干货12】机器学习八股文速通:从损失函数到 XGBoost,一篇带走全部面试点

本文总结了机器学习面试的核心知识点,涵盖监督与非监督学习、线性模型、正则化、决策树、KNN/K-means、SVM、集成学习、梯度下降、评估指标、特征工程、降维、概率模型等内容。重点包括:损失函数选择(MSE/交叉熵)、正则化作用(L1稀疏/L2平滑)、决策树划分准则、集成学习方法(Bagging降方差/Boosting降偏差)、XGBoost优化等。提供了30秒速记口诀和XGBoost代码示例,帮助快速掌握面试要点。全文采用公式+代码+口诀的形式,系统梳理了机器学习从理论到实践的常见考点。

m0_51738372的博客 731

Trafilatura:基于启发式算法的智能网页正文提取工具详解

网页数据提取是数据采集与信息处理中的基础技术,其核心目标是从复杂的HTML文档中准确分离出有价值的结构化内容。传统方法依赖手动编写XPath或CSS选择器规则,面对多样化的网站结构时维护成本高昂。基于机器学习启发式算法的智能提取技术应运而生,它通过分析文本密度、标签清洁度和链接密度等特征,自动识别正文区域,显著提升了通用场景下的提取效率和准确率。这类技术在新闻聚合、内容分析、知识图谱构建等应用场景中价值显著,能够有效处理导航栏、广告、评论等噪音信息。Trafilatura正是这一技术方向的优秀实践,作为一个

weixin_30571465的博客 351

YOLO11改进策略【独家融合改进】| RCSOSA + SPD + WFU

SPD-Conv是一种新的 CNN 构建模块,用于替代传统 CNN 架构中使用的步长卷积(strided convolution)和池化(pooling)层,它由空间到深度(Space-to-depth,SPD)层和非步长卷积(non - strided convolution)层组成。WFU模块通过小波变换的频率分解与跨尺度融合机制,解决了传统上采样过程中的混叠和细节丢失问题,实现了高效、高保真的面部细节重建。

Limiiiing的博客 449

V8 性能剖析指南:基于 Linux perf 与 tick-processor 的 JavaScript 执行剖析

> 导读:本指南以 V8 官方技能文档 [agents/skills/v8-profile/SKILL.md](https://link.gitcode.com/i/8fb21978988a2df5f2a1bc10efe9d997) 为核心,系统讲解如何利用 Linux `perf` 与 V8 内置剖析器剖析 JavaScript 执行耗时。你将掌握 `linux-perf-d8.py` 一键剖析

gitblog_01000的博客 397

FPGA原理与结构(3)——存储单元(Storage Elements)

触发器,锁存器,寄存器,为什么xilinx推荐高电平复位,为什么latch依然存在,FPGA中的触发器与锁存器

apple_53311083的博客 2961

基于Simulink的新能源汽车热管理系统设计与仿真详细介绍

新能源汽车(如纯电动汽车和混合动力汽车)的热管理系统是确保电池、电机和电控系统高效运行的关键。通过合理设计热管理系统,可以提高车辆的续航里程、延长电池寿命并提升整体性能。以下是如何在 MATLAB 和 Simulink 中设计并仿真一个新能源汽车热管理系统的详细步骤。通过上述步骤,我们成功设计并实现了基于 Simulink 的新能源汽车热管理系统。该系统能够根据目标温度和实际反馈,通过 PID 控制器或模糊控制器调整冷却液流量、风扇转速等参数,实现对电池、电机和车内的精确温度控制。

xiaoheshang_123的博客 385

python识别网页文字_python-Web抓取-如何识别网页上的主要内容

python-Web抓取-如何识别网页上的主要内容给定一个新闻文章网页(来自任何主要新闻来源,例如Times或Bloomberg),我想确定该页面上的主要文章内容,并排除其他杂项元素,例如广告,菜单,侧边栏,用户评论。有什么通用的方法可以在大多数主要新闻网站上使用?有什么好的数据挖掘工具或库? (最好是基于python的)9个解决方案29 votes有很多方法可以做到这一点,但是,任何方法都不会永...

weixin_39902184的博客 1599

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

DOM Distiller高级技巧:如何优化内容提取质量与性能

DOM Distiller是一款强大的内容提取工具,能够从网页中精准提取核心内容。本文将分享提升DOM Distiller内容提取质量与性能的实用技巧,帮助你充分发挥其潜力。 ## 一、深入理解内容提取过滤器 DOM Distiller提供了多种内置过滤器,通过合理配置这些过滤器可以显著提升提取质量。核心过滤器位于[java/org/chromium/distiller/filters/](h

gitblog_00611的博客 518

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

Pulpie:基于Pareto最优的网页内容提取模型实践指南

网页内容提取是自然语言处理中的基础技术,旨在从复杂的HTML页面中自动识别和抽取核心文本内容。其技术原理结合了深度学习模型对文档结构的理解能力,通过分析HTML标签、文本密度和语义特征来区分主要内容与噪音。在工程实践中,这种技术能够显著提升网络爬虫、内容聚合系统的数据质量,同时降低人工维护成本。传统方法面临规则维护复杂或模型资源消耗大的挑战,而Pulpie模型家族创新性地采用Pareto最优设计,在模型大小与提取精度之间实现最佳平衡。该方案特别适合需要处理大量网页数据的应用场景,如新闻聚合、知识图谱构建等。

weixin_33824363的博客 322

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

Newspaper3k:Python文章抓取与内容提取的终极指南

Newspaper3k:Python文章抓取与内容提取的终极指南 Newspaper3k是一个专为Python 3设计的强大文章抓取和内容提取库,以其简洁的API设计和高效性能在开发者社区中广受好评。该项目由Lucas Ou-Yang开发,采用MIT许可证,为开发者提供一站式的新闻内容处理解决方案。库的核心架构基于模块化设计,包含Article和Source两个主要对象,支持超过35种语言,具备智...

gitblog_00023的博客 959

Jina Reader:为LLM与RAG系统打造的高效网页内容提取与搜索API

在构建基于大语言模型(LLM)的智能应用时,如何获取高质量、结构化的输入数据是核心挑战。传统网页抓取面临结构噪音、动态渲染和反爬机制等问题,导致提取的文本格式混乱,严重影响LLM的语义理解效果。为了解决这一痛点,Jina Reader项目应运而生,它通过智能内容提取算法和无头浏览器技术,将杂乱的网页HTML转化为纯净、LLM友好的Markdown格式。其技术价值在于,它不仅仅是一个爬虫库,更是一个生产就绪的API服务,提供了“读取”和“搜索”两大核心功能。通过`r.jina.ai`端点,它能智能剥离广告、导

weixin_42519772的博客 575

利用BERT文本分割模型构建智能爬虫:精准提取网页正文与标题

本文介绍了如何利用星图GPU平台自动化部署BERT文本分割-中文-通用领域镜像,构建智能爬虫以精准提取网页正文与标题。该方案通过深度学习模型理解网页语义,能有效过滤导航、广告等噪音,显著提升新闻、博客等长文本内容的数据采集质量与效率。

weixin_29443363的博客 597

基于大模型与Playwright的网页正文智能提取方案

网页正文提取是信息处理领域的基础技术,旨在从复杂HTML结构中精准分离核心内容。传统方法依赖规则或机器学习模型,但面对多样化的网页布局时泛化能力有限。本文介绍一种结合语义理解与自动化抓取的技术方案,利用大语言模型(LLM)的智能识别能力,配合Playwright实现动态页面渲染,最终输出结构化的Markdown格式内容。该方案显著提升了提取准确率与适应性,适用于知识管理、内容分析等场景,并通过Python实现了一套完整的自动化工具链。

340

magic-html:解决复杂网页内容提取难题的智能解析引擎

在当今数据驱动的时代,从海量网页中高效、准确地提取结构化内容已成为数据工程师和技术开发者面临的核心挑战。传统HTML解析工具在处理现代网页的复杂布局、动态内容和多样化格式时往往力不从心,导致提取结果不完整或包含大量噪音。magic-html作为一款先进的通用HTML数据提取器,通过创新的多模态解析技术和智能内容识别算法,为这一技术难题提供了高效解决方案。 ## 核心技术架构解析:智能内容识别与精

gitblog_00698的博客 344
上一篇: jquery 时间封装包
下一篇: 百分比的算法
ArvinStudy
博客等级 码龄15年 83粉丝 193原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值