金年会

每日经济新闻
要闻

每经网首页 > 要闻 > 正文

【java】【htmlparser】htmlparser使用-loull-博客园

闵导 2025-11-03 00:57:14

每经编辑|陶喆    

当地时间2025-11-03,gufjhwebrjewhgksjbfwejrwrwek,小黄鸭导航最新地址一

【Java】【HTMLParser】精通HTML解析的秘密(mi)武器:HTMLParser的强大应用与实(shi)战技巧

在当今信(xin)息爆炸的时代,数据的价(jia)值日益凸显。而互联网,作为海量信息的宝(bao)库,更是吸引着无数开发者前去挖掘。在进行网络数据抓取时,HTML解(jie)析无疑是其中至关重要的一环。想象一下,您面对着一个复杂的(de)HTML文档,需要从中精准地(di)提取出特定的(de)文本信息、链接,甚至(zhi)是表格数据,这该是多么令人头疼的任务?幸运的是,Java社区为我们(men)提供了强大的工具,而HTMLParser便是其中一颗璀璨的明珠(zhu)。

HTMLParser是一个用Java编写的、轻量级的、高效的HTML解析器。它(ta)能够以多种方式解析HTML,包括(kuo)但不限于DOM(DocumentObjectModel)解(jie)析,并提供了(le)一系列便捷的API,让您可以轻松(song)地遍历、搜索和提取HTML文档中的内容(rong)。

相较于一些其他的解析库,HTMLParser的优势在于它的简洁性、易用性(xing)以及对不规范HTML的良好容错性。这使得它在各种Web抓取、数据分析、内容聚合等项目中大放异彩。

深入(ru)了解HTMLParser的核心概念

在正式开始实战之前,我们有必要先理解HTMLParser的一些核心概念。

Parser类:这是HTMLParser的入口点。您可以通过Parser.parse(url)或Parser.parse(newURL(url))来获(huo)取一个Document对象,其中url是您想要解析的HTML网页的地址。

Document对象:代表了(le)整个HTML文档。它包含了文档的所有节点,如元素、文本、注释(shi)等。您可以(yi)将Document对象想象成一个树状结构,其中根节点是整个HTML文档。Node接口:HTML文档中的所有元素、文(wen)本、标签等都可以看作是Node。

Node接(jie)口提(ti)供了一系列通用的方法来访问和操作节点。NodeList:当您通过某些方法获取到多个节点时,它们通常会被封装在一个NodeList中。您可以像(xiang)遍历数组(zu)一样遍(bian)历NodeList,并访问其中的每一个Node。Tag类:Tag类代表了HTML中的一个标签,例如

,,

等。

它提供了获取标签名(ming)、属(shu)性名、属性值等方法。TextNode类:代表HTML中的文本内容。

基础(chu)的HTML解析:从URL到文本

让我们从最基(ji)础的开始,看看如何使用HTMLParser来解析一个网页并提取其中的文本(ben)内容。

您需要将HTMLParser添加到您的Java项目中。如果您使用Maven,可以在pom.xml中添加如下依赖:

org.htmlparserhtmlparser2.1

我们编写一个简单的Java方(fang)法来解析URL并提取文本:

importorg.htmlparser.Parser;importorg.htmlparser.util.ParserException;importorg.htmlparser.nodes.TextNode;importorg.htmlparser.nodes.CompositeNode;importorg.htmlparser.Node;publicclassHtmlParserExample{publicstaticStringextractTextFromUrl(Stringurl){StringBuildertextContent=newStringBuilder();try{Parserparser=newParser(url);NoderootNode=parser.parse(null);//null表示使用默认的ParserFilter//递归遍历节点,提取文本extractTextRecursively(rootNode,textContent);}catch(ParserExceptione){e.printStackTrace();return"ErrorparsingURL:"+e.getMessage();}returntextContent.toString();}privatestaticvoidextractTextRecursively(Nodenode,StringBuildertextContent){if(nodeinstanceofTextNode){textContent.append(((TextNode)node).getText()).append("\n");}elseif(nodeinstanceofCompositeNode){Node[]children=node.getChildrenAsNodeArray();if(children!=null){for(Nodechild:children){extractTextRecursively(child,textContent);}}}}publicstaticvoidmain(String[]args){StringwebsiteUrl="http://example.com";//替换为您想解析的URLStringextractedText=extractTextFromUrl(websiteUrl);System.out.println("ExtractedText:\n"+extractedText);}}

在(zai)这(zhe)个例子中,我们首先(xian)创建一(yi)个Parser对象,然后调用parse(null)方法来解析URL。parser.parse(null)返回的是(shi)整个文档(dang)的根节点。接着,我们定(ding)义了一个递归方法extractTextRecursively来遍历(li)文档树。

当遇到TextNode时,我们就将其文本内容添加到textContent中。

这段代码展示了HTMLParser的基(ji)本用法,它能够将一个完整的HTML页面“翻译”成可读的文本。这对于快速预览网页内容或者进行简单的文本分析非(fei)常有用(yong)。这仅仅是(shi)HTMLParser冰山一角(jiao)。在接下来的部分,我们(men)将深入挖(wa)掘它更强(qiang)大的功能,让您能够精确地定位并提取您所需的数据。

定位与提取:精准(zhun)抓(zhua)取您需要的信息

在实际应用中(zhong),我们通常不(bu)会想要提取网页的全部文本,而是需要精确地定位到特定的元素,例如所有的链接、特定class的div、或者某个id的元素。HTMLParser提供了强大的过(guo)滤(lv)和查找机制,让这种精确(que)操作变得触手可及。

1.使用(yong)NodeFilter进(jin)行精确匹配

HTMLParser的核心过滤机制是NodeFilter接口。您可以实现这个接口,定义自己的过滤规则,来选择您感兴趣的(de)节点。最常用的NodeFilter实现类是TagNameFilter(按(an)标签(qian)名过滤)和AndFilter(组合多个(ge)过滤器)。

示例:提取所有标签的链接

importorg.htmlparser.Parser;importorg.htmlparser.filters.TagNameFilter;importorg.htmlparser.nodes.TagNode;importorg.htmlparser.util.ParserException;importorg.htmlparser.NodeIterator;importorg.htmlparser.Node;importorg.htmlparser.util.NodeList;publicclassLinkExtractor{publicstaticvoidextractLinks(Stringurl){try{Parserparser=newParser(url);//使(shi)用TagNameFilter来只选择标签NodeListnodeList=parser.extractAllNodesThatMatch(newTagNameFilter("a"));for(inti=0;i

在这个例子中,TagNameFilter("a")会告诉HTMLParser只返回标签。然后,我们遍历这(zhe)些标签,并从中提取href属性的值。这只是NodeFilter的一个简单应用,您还可以组合多个过滤器,例如同时按(an)标签名和属性名进行过滤,实(shi)现更精(jing)细的选择(ze)。

2.遍历DOM树,查找特定元素

除了使(shi)用过滤器,您还可以直接遍历(li)Document的DOM树,并结合条件判断来查(cha)找特定元素。这在处理结(jie)构相对固定的HTML时(shi)非(fei)常(chang)有(you)效。

示例(li):查找带有特定id的元素

importorg.htmlparser.Parser;importorg.htmlparser.nodes.TagNode;importorg.htmlparser.util.ParserException;importorg.htmlparser.Node;importorg.htmlparser.NodeVisitor;publicclassSpecificElementFinder{publicstaticvoidfindDivById(Stringurl,StringtargetId){try{Parserparser=newParser(url);NoderootNode=parser.parse(null);//使用NodeVisitor来(lai)遍历节点rootNode.accept(newNodeVisitor(){@OverridepublicvoidvisitTag(TagNodetag){//检查是否是div标签,并且id属性(xing)匹配if("div".equalsIgnoreCase(tag.getTagName())&&targetId.equals(tag.getAttribute("id"))){System.out.println("Founddivwithid'"+targetId+"':"+tag.toHtml());//如果只需要第一个匹配的,可以在这里设置一个标志并中断遍历}super.visitTag(tag);//继续访(fang)问子节点}});}catch(ParserExceptione){e.printStackTrace();}}publicstaticvoidmain(String[]args){StringwebsiteUrl="http://example.com";//替换为您想解析的URLStringidToFind="main-content";//替换(huan)为您想查找的idfindDivById(websiteUrl,idToFind);}}

NodeVisitor是一个强大的(de)遍历工具,它允许您在遍历DOM树的(de)过程中,对不同类型的节点执行自定义操作。在这个例(li)子中,我们重写了visitTag方法,当遇到

2025-11-03,操人app,以竞争政策重塑中国市场经济新优势

1.丁香社区五月天偷拍,沪股通现身8只个股龙虎榜吃瓜黑料3p,特朗普称准备对俄罗斯实施第二阶段制裁

图片来源:每经记者 阿德南·纳塞尔 摄

2.抖音风反差婊弹力摇混剪合集+mogu141在线观看,郭平:华为开创鸿蒙系统是一件不得不做的事情

3.性一交一乱一乱一视频+刘婷演绎勾引,又一家上市公司“爆雷”!ST帕瓦实控人被捕,投资者如何挽损?

国产熟妇 码AV水也+大神专门开发学生诱骗小女孩从啪啪啪到多p越玩越刺p蜜桃视频,远东资信:熊猫债市场2025年上半年回顾及下半年展望

高嫁柳家高清点播-古装剧-星辰影院

封面图片来源:图片来源:每经记者 名称 摄

如需转载请与《每日经济新闻》报社联系。
未经《每日经济新闻》报社授权,严禁转载或镜像,违者必究。

读者热线:4008890008

特别提醒:如果我们使用了您的图片,请作者与本站联系索取稿酬。如您不希望作品出现在本站,可联系金年会要求撤下您的作品。

欢迎关注每日经济新闻APP

每经经济新闻官方APP

0

0

Sitemap