金年会

每日经济新闻
要闻

每经网首页 > 要闻 > 正文

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

陈旭亮 2025-11-02 03:24:30

每经编辑|陈秀英    

当地时间2025-11-02,jdsklfjkwebbkjfbsdkhjvbuigdbajhs,总裁双手攀上两团高峰的视频

【Java】【HTMLParser】精(jing)通HTML解(jie)析(xi)的秘密武器(qi):HTMLParser的(de)强大(da)应用(yong)与(yu)实(shi)战技(ji)巧

在(zai)当(dang)今信息(xi)爆炸的时(shi)代,数(shu)据的(de)价值日(ri)益(yi)凸(tu)显(xian)。而互联网(wang),作为(wei)海(hai)量信(xin)息(xi)的宝(bao)库(ku),更(geng)是吸(xi)引着(zhe)无数(shu)开发(fa)者前去挖掘。在进行(xing)网(wang)络数据(ju)抓取(qu)时(shi),HTML解(jie)析无疑是(shi)其中(zhong)至关(guan)重要的(de)一(yi)环。想象一(yi)下,您面(mian)对(dui)着一个复杂的(de)HTML文档,需要(yao)从中(zhong)精准(zhun)地提取(qu)出(chu)特(te)定(ding)的文本信(xin)息、链接,甚(shen)至是(shi)表格数(shu)据,这该(gai)是多么令(ling)人头(tou)疼的任务?幸运(yun)的(de)是,Java社(she)区为我们提供了强大(da)的工具,而(er)HTMLParser便是(shi)其中一颗璀璨的明(ming)珠(zhu)。

HTMLParser是一个(ge)用Java编写的(de)、轻(qing)量(liang)级的、高效(xiao)的HTML解析器(qi)。它(ta)能(neng)够以多(duo)种方式解析HTML,包括(kuo)但不限于(yu)DOM(DocumentObjectModel)解析(xi),并(bing)提(ti)供了(le)一(yi)系(xi)列便捷(jie)的(de)API,让您(nin)可以轻松(song)地遍(bian)历、搜索和(he)提取(qu)HTML文(wen)档(dang)中的内(nei)容。

相较(jiao)于一(yi)些(xie)其他(ta)的(de)解(jie)析库,HTMLParser的(de)优势在于(yu)它(ta)的简(jian)洁性、易用性以及对不(bu)规(gui)范(fan)HTML的(de)良好容(rong)错性(xing)。这(zhe)使得它(ta)在各种(zhong)Web抓取、数据分(fen)析、内容聚(ju)合等(deng)项(xiang)目中(zhong)大(da)放(fang)异彩(cai)。

深入了(le)解HTMLParser的核心(xin)概念(nian)

在(zai)正式开(kai)始实(shi)战之前,我(wo)们有必要(yao)先理(li)解HTMLParser的(de)一(yi)些核心概念(nian)。

Parser类:这是HTMLParser的(de)入口(kou)点。您可以(yi)通过(guo)Parser.parse(url)或Parser.parse(newURL(url))来(lai)获(huo)取一个(ge)Document对(dui)象(xiang),其(qi)中url是您(nin)想要(yao)解析的HTML网(wang)页的地址(zhi)。

Document对(dui)象:代表了整个HTML文(wen)档。它包(bao)含(han)了文档的(de)所有(you)节点(dian),如(ru)元素(su)、文(wen)本、注(zhu)释等(deng)。您(nin)可(ke)以将Document对象想(xiang)象(xiang)成一(yi)个树状结构,其(qi)中根(gen)节(jie)点(dian)是整(zheng)个HTML文档。Node接口:HTML文(wen)档(dang)中的所有元素、文(wen)本、标签等(deng)都可以(yi)看作是(shi)Node。

Node接口(kou)提供了一(yi)系列(lie)通用(yong)的方(fang)法来访问和操(cao)作节(jie)点。NodeList:当(dang)您通(tong)过某些方(fang)法获(huo)取到(dao)多个(ge)节(jie)点(dian)时,它(ta)们(men)通常会(hui)被封装在(zai)一个NodeList中。您(nin)可以(yi)像遍(bian)历数组一(yi)样遍(bian)历(li)NodeList,并访问其(qi)中(zhong)的每(mei)一个(ge)Node。Tag类:Tag类代表了HTML中(zhong)的一个标(biao)签,例(li)如(ru)

,,

等(deng)。

它提(ti)供(gong)了获(huo)取(qu)标签名、属(shu)性名、属性(xing)值等(deng)方(fang)法(fa)。TextNode类:代(dai)表HTML中的(de)文(wen)本内(nei)容。

基(ji)础的(de)HTML解析(xi):从(cong)URL到文本

让我(wo)们从最基(ji)础的(de)开始,看看(kan)如(ru)何(he)使用HTMLParser来解析一个网页并(bing)提取(qu)其(qi)中的文(wen)本内容。

您(nin)需(xu)要将(jiang)HTMLParser添加到您的(de)Java项目中(zhong)。如(ru)果您使用(yong)Maven,可以(yi)在pom.xml中添加如(ru)下依(yi)赖(lai):

org.htmlparserhtmlparser2.1

我们(men)编写一个(ge)简(jian)单(dan)的Java方法来(lai)解析(xi)URL并提(ti)取文(wen)本:

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表示使(shi)用默(mo)认的ParserFilter//递归(gui)遍(bian)历(li)节点(dian),提(ti)取(qu)文本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";//替换(huan)为(wei)您(nin)想(xiang)解(jie)析的URLStringextractedText=extractTextFromUrl(websiteUrl);System.out.println("ExtractedText:\n"+extractedText);}}

在这(zhe)个(ge)例(li)子中,我们(men)首先(xian)创建一个(ge)Parser对象(xiang),然后(hou)调(diao)用parse(null)方(fang)法(fa)来解析URL。parser.parse(null)返(fan)回的(de)是整个文档的(de)根节点(dian)。接(jie)着,我(wo)们定(ding)义(yi)了一个递归(gui)方法(fa)extractTextRecursively来遍(bian)历(li)文档树(shu)。

当遇(yu)到TextNode时(shi),我们就(jiu)将(jiang)其(qi)文(wen)本(ben)内容添加到textContent中。

这(zhe)段(duan)代(dai)码展(zhan)示了HTMLParser的基(ji)本用法,它(ta)能够(gou)将一(yi)个完整的HTML页面(mian)“翻译(yi)”成可读的(de)文(wen)本。这对(dui)于(yu)快速预览网页(ye)内(nei)容(rong)或者进(jin)行简(jian)单(dan)的文本(ben)分析(xi)非常(chang)有用(yong)。这(zhe)仅仅(jin)是HTMLParser冰(bing)山(shan)一角(jiao)。在接下来(lai)的部分,我们将(jiang)深入挖掘它更(geng)强大(da)的功能,让您能(neng)够精(jing)确地定(ding)位并提(ti)取您所需(xu)的数据。

定(ding)位(wei)与提(ti)取:精(jing)准抓取(qu)您需(xu)要的(de)信息

在实(shi)际应(ying)用中,我们通常(chang)不会想(xiang)要提(ti)取(qu)网页的全部文本,而(er)是需要精(jing)确地定(ding)位到特(te)定的元素(su),例如(ru)所有的链(lian)接、特(te)定class的div、或者(zhe)某(mou)个(ge)id的元素。HTMLParser提供了(le)强大的(de)过(guo)滤和(he)查找机制(zhi),让这(zhe)种(zhong)精确操作变得触(chu)手可(ke)及(ji)。

1.使(shi)用NodeFilter进行(xing)精(jing)确匹(pi)配

HTMLParser的(de)核(he)心过滤(lv)机(ji)制(zhi)是NodeFilter接口(kou)。您(nin)可(ke)以实(shi)现这个(ge)接口,定义(yi)自(zi)己(ji)的过(guo)滤规则,来(lai)选择(ze)您感(gan)兴趣(qu)的节(jie)点(dian)。最常用(yong)的NodeFilter实(shi)现类是(shi)TagNameFilter(按(an)标签(qian)名(ming)过(guo)滤)和(he)AndFilter(组(zu)合多个(ge)过滤(lv)器)。

示(shi)例(li):提取所(suo)有标(biao)签的(de)链接(jie)

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)用(yong)TagNameFilter来只(zhi)选择(ze)标签NodeListnodeList=parser.extractAllNodesThatMatch(newTagNameFilter("a"));for(inti=0;i

在(zai)这个(ge)例(li)子中(zhong),TagNameFilter("a")会(hui)告(gao)诉(su)HTMLParser只(zhi)返回(hui)标(biao)签(qian)。然后(hou),我们(men)遍历(li)这些标(biao)签,并从中提(ti)取href属性的(de)值。这(zhe)只是NodeFilter的(de)一(yi)个(ge)简单应用,您还可(ke)以组(zu)合多(duo)个过滤(lv)器,例(li)如同时(shi)按标签名(ming)和属(shu)性名(ming)进行(xing)过滤(lv),实现更(geng)精(jing)细的选择。

2.遍(bian)历(li)DOM树(shu),查(cha)找特定元素

除(chu)了使(shi)用过滤(lv)器(qi),您还(hai)可以(yi)直(zhi)接(jie)遍历Document的(de)DOM树,并结(jie)合条(tiao)件(jian)判断来(lai)查(cha)找特定(ding)元素(su)。这在处理(li)结构(gou)相对(dui)固(gu)定(ding)的HTML时(shi)非常有效(xiao)。

示(shi)例:查找(zhao)带有特定(ding)id的(de)元素

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)遍历节点(dian)rootNode.accept(newNodeVisitor(){@OverridepublicvoidvisitTag(TagNodetag){//检查(cha)是(shi)否(fou)是div标签,并(bing)且id属性(xing)匹(pi)配if("div".equalsIgnoreCase(tag.getTagName())&&targetId.equals(tag.getAttribute("id"))){System.out.println("Founddivwithid'"+targetId+"':"+tag.toHtml());//如果只(zhi)需要(yao)第一个(ge)匹配的(de),可(ke)以(yi)在这(zhe)里(li)设置一(yi)个标(biao)志并(bing)中(zhong)断遍历(li)}super.visitTag(tag);//继(ji)续访(fang)问(wen)子(zi)节(jie)点}});}catch(ParserExceptione){e.printStackTrace();}}publicstaticvoidmain(String[]args){StringwebsiteUrl="http://example.com";//替换为(wei)您(nin)想(xiang)解析的URLStringidToFind="main-content";//替(ti)换为(wei)您想查(cha)找(zhao)的idfindDivById(websiteUrl,idToFind);}}

NodeVisitor是(shi)一(yi)个(ge)强大的遍历(li)工具,它(ta)允许(xu)您在遍(bian)历DOM树的(de)过程中,对(dui)不同(tong)类(lei)型(xing)的节(jie)点执(zhi)行(xing)自(zi)定义(yi)操作(zuo)。在(zai)这个例子中(zhong),我们重写(xie)了(le)visitTag方法,当遇到(dao)

2025-11-02,zozo女人与zozozo的特点,美高域将于9月19日派发特别股息每股0.1港元

1.深圳唐伯虎在线网站免费,重估名创优品:下一个泡泡玛特?hongtaovip123com了,上海“临港科创城”推进大会举行,临港集团 “超级个体288行动”发布

图片来源:每经记者 陆明 摄

2.今夜无人入睡视频免费观看中文版全集+息子交尾的流程和费用,【国金电子】博通公司深度:ASIC+scale up+scale out全布局,AI核心受益标的

3.樱花动漫授乳中+爽躁多水快深点17c14,雪祺电气:拟收购合肥盛邦电器部分股权并增资

吸血裸女+um33cc陈冠希328rcc,Ulta Beauty早盘下跌4.8%,此前预警销售增长放缓

中国????XXXX⑧尤果圈精选内容推荐,最新资源分享

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

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

读者热线:4008890008

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

欢迎关注每日经济新闻APP

每经经济新闻官方APP

0

0

Sitemap