`
springlys
  • 浏览: 7141 次
  • 性别: Icon_minigender_1
  • 来自: 福州
最近访客 更多访客>>
社区版块
存档分类
最新评论

htmlparser使用指南

 
阅读更多



 简介
   
   htmlparser是一个纯的java写的html解析的库,它不依赖于其它的java库文件,主要用于改造或提取html,它能超高速解析html。
htmlparser基本功能
  1. 信息提取   
     · 文本信息抽取,例如对HTML进行有效信息搜索   
     · 链接提取,用于自动给页面的链接文本加上链接的标签   
     · 资源提取,例如对一些图片、声音的资源的处理   
     · 链接检查,用于检查HTML中的链接是否有效   
     · 页面内容的监控   
    2. 信息转换   
     · 链接重写,用于修改页面中的所有超链接
    · 网页内容拷贝,用于将网页内容保存到本地
    · 内容检验,可以用来过滤网页上一些令人不愉快的字词
    · HTML信息清洗,把本来乱七八糟的HTML信息格式化
    · 转成XML格式数据
库说明
   1、htmlparser对html页面处理的数据结构


   如图所示,HtmlParser采用了经典的Composite模式,通过RemarkNode、TextNode、TagNode、AbstractNode和Tag来描述HTML页面各元素
  1)、org.htmlparser.Node:Node接口定义了进行树形结构节点操作的各种典型操作方法

      包括:
        节点到html文本、text文本的方法:toPlainTextString、toHtml 
        典型树形结构遍历的方法:getParent、getChildren、getFirstChild、getLastChild、getPreviousSibling、getNextSibling、getText 
       获取节点对应的树形结构结构的顶级节点Page对象方法:getPage

       获取节点起始位置的方法:getStartPosition、getEndPosition
       Visitor方法遍历节点时候方法:accept (NodeVisitor visitor) 
       Filter方法:collectInto (NodeList list, NodeFilter filter)
       Object方法:toString、clone

   2)、org.htmlparser.nodes.AbstractNode:AbstractNode是形成HTML树形结构抽象基类,实现了Node接口。  

     在htmlparser中,Node分成三类:
      RemarkNode:代表Html中的注释  TagNode:标签节点   TextNode:文本节点
      这三类节点都继承AbstractNode。
      org.htmlparser.nodes.TagNode:
      TagNode包含了对HTML处理的核心的各个类,是所有TAG的基类,其中有分为包含其他TAG的复合节ComositeTag和不包含其他TAG的叶子节点Tag。 
 

复合节点CompositeTag:

AppletTag,BodyTag,Bullet,BulletList,DefinitionList,DefinitionListBullet,Div,FormTag,FrameSetTag,HeadingTag,

HeadTag,Html,LabelTag,LinkTag,ObjectTag,ParagraphTag,ScriptTag,SelectTag,Span,StyleTag,TableColumn,

TableHeader,TableRow,TableTag,TextareaTag,TitleTag

叶子节点TAG:

BaseHrefTag,DoctypeTag,FrameTag,ImageTag,InputTag,JspTag,MetaTag,ProcessingInstructionTag,

2、htmlparser对html页面处理的算法
主要是如下几种方式

采用Visitor方式访问Html
try {
Parser parser = new Parser();
parser.setURL(”http://www.google.com”);
parser.setEncoding(parser.getEncoding());
NodeVisitor visitor = new NodeVisitor() {
public void visitTag(Tag tag) {
logger.fatal(”testVisitorAll()  Tag name is :”
+ tag.getTagName() + ” \n Class is :”
+ tag.getClass());
}

};

parser.visitAllNodesWith(visitor);
} catch (ParserException e) {
e.printStackTrace();
}

采用Filter方式访问html
try {

NodeFilter filter = new NodeClassFilter(LinkTag.class);
Parser parser = new Parser();
parser.setURL(”http://www.google.com”);
parser.setEncoding(parser.getEncoding());
NodeList list = parser.extractAllNodesThatMatch(filter);
for (int i = 0; i < list.size(); i++) {
LinkTag node = (LinkTag) list.elementAt(i);
logger.fatal(”testLinkTag() Link is :” + node.extractLink());
}
} catch (Exception e) {
e.printStackTrace();
}

采用org.htmlparser.beans方式
另外htmlparser 还在org.htmlparser.beans中对一些常用的方法进行了封装,以简化操作,例如:

Parser parser = new Parser();

LinkBean linkBean = new LinkBean();
linkBean.setURL(”http://www.google.com”);
URL[] urls = linkBean.getLinks();

for (int i = 0; i < urls.length; i++) {
URL url = urls[i];
logger.fatal(”testLinkBean() -url  is :” + url);
}

3、htmlparser关键包结构说明
htmlparser其实核心代码并不多,好好研究一下其代码,弥补文档不足的问题。同时htmlparser的代码注释和单元测试用例还是很齐全的,也有助于了解htmlparser的用法。

3.1、org.htmlparser
定义了htmlparser的一些基础类。其中最为重要的是Parser类。

Parser是htmlparser的最核心的类,其构造函数提供了如下:Parser.createParser (String html, String charset)、 Parser ()、Parser (Lexer lexer, ParserFeedback fb)、Parser (URLConnection connection, ParserFeedback fb)、Parser (String resource, ParserFeedback feedback)、 Parser (String resource)

各构造函数的具体用法及含义可以查看其代码,很容易理解。

Parser常用的几个方法:

  elements获取元素
Parser parser = new Parser (”http://www.google.com”);
for (NodeIterator i = parser.elements (); i.hasMoreElements (); )
processMyNodes (i.nextNode ());

parse (NodeFilter filter):通过NodeFilter方式获取
visitAllNodesWith (NodeVisitor visitor):通过Nodevisitor方式
extractAllNodesThatMatch (NodeFilter filter):通过NodeFilter方式
3.2、org.htmlparser.beans
对Visitor和Filter的方法进行了封装,定义了针对一些常用html元素操作的bean,简化对常用元素的提取操作。

包括:FilterBean、HTMLLinkBean、HTMLTextBean、LinkBean、StringBean、BeanyBaby等。

3.3、org.htmlparser.nodes
定义了基础的node,包括:AbstractNode、RemarkNode、TagNode、TextNode等。

3.4、org.htmlparser.tags
定义了htmlparser的各种tag。

3.5、org.htmlparser.filters
定义了htmlparser所提供的各种filter,主要通过extractAllNodesThatMatch (NodeFilter filter)来对html页面指定类型的元素进行过滤,包括:AndFilter、CssSelectorNodeFilter、 HasAttributeFilter、HasChildFilter、HasParentFilter、HasSiblingFilter、 IsEqualFilter、LinkRegexFilter、LinkStringFilter、NodeClassFilter、 NotFilter、OrFilter、RegexFilter、StringFilter、TagNameFilter、XorFilter

3.6、org.htmlparser.visitors
定义了htmlparser所提供的各种visitor,主要通过visitAllNodesWith (NodeVisitor visitor)来对html页面元素进行遍历,包括:HtmlPage、LinkFindingVisitor、NodeVisitor、 ObjectFindingVisitor、StringFindingVisitor、TagFindingVisitor、 TextExtractingVisitor、UrlModifyingVisitor

3.7、org.htmlparser.parserapplications
定义了一些实用的工具,包括LinkExtractor、SiteCapturer、StringExtractor、WikiCapturer,这几个类也可以作为htmlparser使用样例。

3.8、org.htmlparser.tests
对各种功能的单元测试用例,也可以作为htmlparser使用的样例。

 

4、htmlparser的使用样例

 

import java.net.URL;

import junit.framework.TestCase;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.htmlparser.Node;
import org.htmlparser.NodeFilter;
import org.htmlparser.Parser;
import org.htmlparser.Tag;
import org.htmlparser.beans.LinkBean;
import org.htmlparser.filters.NodeClassFilter;
import org.htmlparser.filters.OrFilter;
import org.htmlparser.filters.TagNameFilter;
import org.htmlparser.tags.HeadTag;
import org.htmlparser.tags.ImageTag;
import org.htmlparser.tags.InputTag;
import org.htmlparser.tags.LinkTag;
import org.htmlparser.tags.OptionTag;
import org.htmlparser.tags.SelectTag;
import org.htmlparser.tags.TableColumn;
import org.htmlparser.tags.TableRow;
import org.htmlparser.tags.TableTag;
import org.htmlparser.tags.TitleTag;
import org.htmlparser.util.NodeIterator;
import org.htmlparser.util.NodeList;
import org.htmlparser.util.ParserException;
import org.htmlparser.visitors.HtmlPage;
import org.htmlparser.visitors.NodeVisitor;
import org.htmlparser.visitors.ObjectFindingVisitor;

public class ParserTestCase extends TestCase {

	protected static Log logger = LogFactory.getLog(ParserTestCase.class);

	public ParserTestCase(String name) {
		super(name);
	}

	/*
	 * 测试ObjectFindVisitor的用法
	 */
	public void testImageVisitor() {
		try {
			ImageTag imgLink;
			ObjectFindingVisitor visitor = new ObjectFindingVisitor(
					ImageTag.class);
			Parser parser = new Parser();
			parser.setURL("http://www.google.com");
			parser.setEncoding(parser.getEncoding());
			parser.visitAllNodesWith(visitor);
			Node[] nodes = visitor.getTags();
			for (int i = 0; i < nodes.length; i++) {
				imgLink = (ImageTag) nodes[i];
				logger.fatal("testImageVisitor() ImageURL = "
						+ imgLink.getImageURL());
				logger.fatal("testImageVisitor() ImageLocation = "
						+ imgLink.extractImageLocn());
				logger.fatal("testImageVisitor() SRC = "
						+ imgLink.getAttribute("SRC"));
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	/*
	 * 测试TagNameFilter用法
	 */
	public void testNodeFilter() {
		try {
			NodeFilter filter = new TagNameFilter("IMG");
			Parser parser = new Parser();
			parser.setURL("http://www.google.com");
			parser.setEncoding(parser.getEncoding());
			NodeList list = parser.extractAllNodesThatMatch(filter);
			for (int i = 0; i < list.size(); i++) {
				logger.fatal("testNodeFilter() " + list.elementAt(i).toHtml());
			}
		} catch (Exception e) {
			e.printStackTrace();
		}

	}

	/*
	 * 测试NodeClassFilter用法
	 */
	public void testLinkTag() {
		try {

			NodeFilter filter = new NodeClassFilter(LinkTag.class);
			Parser parser = new Parser();
			parser.setURL("http://www.google.com");
			parser.setEncoding(parser.getEncoding());
			NodeList list = parser.extractAllNodesThatMatch(filter);
			for (int i = 0; i < list.size(); i++) {
				LinkTag node = (LinkTag) list.elementAt(i);
				logger.fatal("testLinkTag() Link is :" + node.extractLink());
			}
		} catch (Exception e) {
			e.printStackTrace();
		}

	}

	/*
	 * 测试<link href=" text=’text/css’ rel=’stylesheet’ />用法
	 */
	public void testLinkCSS() {
		try {

			Parser parser = new Parser();
			parser
					.setInputHTML("<head><title>Link Test</title>"
							+ "<link href='/test01/css.css' text='text/css' rel='stylesheet' />"
							+ "<link href='/test02/css.css' text='text/css' rel='stylesheet' />"
							+ "</head>" + "<body>");
			parser.setEncoding(parser.getEncoding());

			for (NodeIterator e = parser.elements(); e.hasMoreNodes();) {
				Node node = e.nextNode();
				logger
						.fatal("testLinkCSS()" + node.getText()
								+ node.getClass());

			}
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	/*
	 * 测试OrFilter的用法
	 */
	public void testOrFilter() {
		NodeFilter inputFilter = new NodeClassFilter(InputTag.class);
		NodeFilter selectFilter = new NodeClassFilter(SelectTag.class);
		NodeList nodeList = null;
		try {
			Parser parser = new Parser();
			parser
					.setInputHTML("<head><title>OrFilter Test</title>"
							+ "<link href='/test01/css.css' text='text/css' rel='stylesheet' />"
							+ "<link href='/test02/css.css' text='text/css' rel='stylesheet' />"
							+ "</head>"
							+ "<body>"
							+ "<input type='text' value='text1′ name='text1′/>"
							+ "<input type='text' value='text2′ name='text2′/>"
							+ "<select><option id='1′>1</option><option id='2′>2</option><option id='3′></option></select>"
							+ "<a href='http://www.yeeach.com'>yeeach.com</a>"
							+ "</body>");

			parser.setEncoding(parser.getEncoding());
			OrFilter lastFilter = new OrFilter();
			lastFilter.setPredicates(new NodeFilter[] { selectFilter,
					inputFilter });
			nodeList = parser.parse(lastFilter);
			for (int i = 0; i <= nodeList.size(); i++) {
				if (nodeList.elementAt(i) instanceof InputTag) {
					InputTag tag = (InputTag) nodeList.elementAt(i);
					logger.fatal("OrFilter tag name is :" + tag.getTagName()
							+ " ,tag value is:" + tag.getAttribute("value"));
				}
				if (nodeList.elementAt(i) instanceof SelectTag) {
					SelectTag tag = (SelectTag) nodeList.elementAt(i);
					NodeList list = tag.getChildren();

					for (int j = 0; j < list.size(); j++) {
						OptionTag option = (OptionTag) list.elementAt(j);
						logger
								.fatal("OrFilter Option"
										+ option.getOptionText());
					}

				}
			}

		} catch (ParserException e) {
			e.printStackTrace();
		}
	}

	/*
	 * 测试对<table><tr><td></td></tr></table>的解析
	 */
	public void testTable() {
		Parser myParser;
		NodeList nodeList = null;
		myParser = Parser.createParser("<body> " + "<table id='table1′ >"
				+ "<tr><td>1-11</td><td>1-12</td><td>1-13</td>"
				+ "<tr><td>1-21</td><td>1-22</td><td>1-23</td>"
				+ "<tr><td>1-31</td><td>1-32</td><td>1-33</td></table>"
				+ "<table id='table2′ >"
				+ "<tr><td>2-11</td><td>2-12</td><td>2-13</td>"
				+ "<tr><td>2-21</td><td>2-22</td><td>2-23</td>"
				+ "<tr><td>2-31</td><td>2-32</td><td>2-33</td></table>"
				+ "</body>", "GBK");
		NodeFilter tableFilter = new NodeClassFilter(TableTag.class);
		OrFilter lastFilter = new OrFilter();
		lastFilter.setPredicates(new NodeFilter[] { tableFilter });
		try {
			nodeList = myParser.parse(lastFilter);
			for (int i = 0; i <= nodeList.size(); i++) {
				if (nodeList.elementAt(i) instanceof TableTag) {
					TableTag tag = (TableTag) nodeList.elementAt(i);
					TableRow[] rows = tag.getRows();

					for (int j = 0; j < rows.length; j++) {
						TableRow tr = (TableRow) rows[j];
						TableColumn[] td = tr.getColumns();
						for (int k = 0; k < td.length; k++) {
							logger.fatal("<td>" + td[k].toPlainTextString());
						}

					}

				}
			}

		} catch (ParserException e) {
			e.printStackTrace();
		}
	}

	/*
	 * 测试NodeVisitor的用法,遍历所有节点
	 */
	public void testVisitorAll() {
		try {
			Parser parser = new Parser();
			parser.setURL("http://www.google.com");
			parser.setEncoding(parser.getEncoding());
			NodeVisitor visitor = new NodeVisitor() {
				public void visitTag(Tag tag) {
					logger.fatal("testVisitorAll()  Tag name is :"
							+ tag.getTagName() + " \n Class is :"
							+ tag.getClass());
				}

			};

			parser.visitAllNodesWith(visitor);
		} catch (ParserException e) {
			e.printStackTrace();
		}
	}

	/*
	 * 测试对指定Tag的NodeVisitor的用法
	 */
	public void testTagVisitor() {
		try {

			Parser parser = new Parser(
					"<head><title>dddd</title>"
							+ "<link href='/test01/css.css' text='text/css' rel='stylesheet' />"
							+ "<link href='/test02/css.css' text='text/css' rel='stylesheet' />"
							+ "</head>" + "<body>"
							+ "<a href='http://www.yeeach.com'>yeeach.com</a>"
							+ "</body>");
			NodeVisitor visitor = new NodeVisitor() {
				public void visitTag(Tag tag) {
					if (tag instanceof HeadTag) {
						logger.fatal("visitTag() HeadTag : Tag name is :"
								+ tag.getTagName() + " \n Class is :"
								+ tag.getClass() + "\n Text is :"
								+ tag.getText());
					} else if (tag instanceof TitleTag) {
						logger.fatal("visitTag() TitleTag : Tag name is :"
								+ tag.getTagName() + " \n Class is :"
								+ tag.getClass() + "\n Text is :"
								+ tag.getText());

					} else if (tag instanceof LinkTag) {
						logger.fatal("visitTag() LinkTag : Tag name is :"
								+ tag.getTagName() + " \n Class is :"
								+ tag.getClass() + "\n Text is :"
								+ tag.getText() + " \n getAttribute is :"
								+ tag.getAttribute("href"));
					} else {
						logger.fatal("visitTag() : Tag name is :"
								+ tag.getTagName() + " \n Class is :"
								+ tag.getClass() + "\n Text is :"
								+ tag.getText());
					}

				}

			};

			parser.visitAllNodesWith(visitor);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	/*
	 * 测试HtmlPage的用法
	 */
	public void testHtmlPage() {
		String inputHTML = "<html>" + "<head>"
				+ "<title>Welcome to the HTMLParser website</title>"
				+ "</head>" + "<body>" + "Welcome to HTMLParser"
				+ "<table id='table1′ >"
				+ "<tr><td>1-11</td><td>1-12</td><td>1-13</td>"
				+ "<tr><td>1-21</td><td>1-22</td><td>1-23</td>"
				+ "<tr><td>1-31</td><td>1-32</td><td>1-33</td></table>"
				+ "<table id='table2′ >"
				+ "<tr><td>2-11</td><td>2-12</td><td>2-13</td>"
				+ "<tr><td>2-21</td><td>2-22</td><td>2-23</td>"
				+ "<tr><td>2-31</td><td>2-32</td><td>2-33</td></table>"
				+ "</body>" + "</html>";
		Parser parser = new Parser();
		try {
			parser.setInputHTML(inputHTML);
			parser.setEncoding(parser.getURL());
			HtmlPage page = new HtmlPage(parser);
			parser.visitAllNodesWith(page);
			logger.fatal("testHtmlPage -title is :" + page.getTitle());
			NodeList list = page.getBody();

			for (NodeIterator iterator = list.elements(); iterator
					.hasMoreNodes();) {
				Node node = iterator.nextNode();
				logger.fatal("testHtmlPage -node  is :" + node.toHtml());
			}

		} catch (ParserException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

	/*
	 * 测试LinkBean的用法
	 */
	public void testLinkBean() {
		LinkBean linkBean = new LinkBean();
		linkBean.setURL("http://www.google.com");
		URL[] urls = linkBean.getLinks();
		for (int i = 0; i < urls.length; i++) {
			URL url = urls[i];
			logger.fatal("testLinkBean() -url  is :" + url);
		}
	}

 

 

 

本文来自http://kdisk-sina-com.iteye.com/blog/549412 

本人是边学习,边整理排版的

 

  • 大小: 64.5 KB
分享到:
评论

相关推荐

    htmlparser 使用指南 入门 必读htmlparser 使用指南 入门 必读htmlparser 使用指南 入门 必读

    HTMLParser的核心使用场景主要有两个:提取(extraction)和转换(transformation)。提取是指从网页中抽取数据,而转换则是指修改或创建新的HTML内容。1.4版本的HTMLParser在转换领域有了显著的改进,简化了标签的创建...

    网络爬虫 HTMLParser 使用指南

    综上所述,网络爬虫开发者在使用HTMLParser进行开发时,需要了解它的基本原理、核心类和构造函数、调试工具的使用、页面编码设置方法、以及一些基本的代码实践。同时,开发者应该具备良好的问题解决和代码调试能力,...

    htmlparser 资料集合

    `htmlparser使用指南 4_海起啦啦.txt`是关于使用HTMLParser的指导性文本,可能会提供逐步教程,帮助新手快速上手。 至于`htmlParser收集记录 - 记忆有问题!!! - CSDN博客.files`,这可能是一些博客文章的附件,可能...

    HTMLParser使用文档和jar包

    这份文档通常包含API参考、教程、示例代码和用户指南,是学习和理解HTMLParser的关键资源。通过阅读这份文档,你可以了解到如何初始化解析器,如何处理HTML元素,以及如何处理HTML中的属性和文本内容。 其次,`...

    HTMLParser.net源代码HTMLParser.net使用demo

    3. **文档**:可能包含使用指南、API参考或示例代码注释,帮助开发者理解和使用这个库。 4. **测试代码**:可能包括单元测试或集成测试,证明库的功能性和稳定性。 通过研究这些示例代码,开发者可以了解如何在自己...

    Htmlparser包(带有使用指南和例子)

    在这个压缩包中,包含了HTMLParser的核心程序包、示例代码以及使用指南,这对于理解和应用这个库非常有帮助。 HTMLParser的设计目标是能够处理不规则的HTML,因为实际网页往往不会严格按照HTML标准编写。它允许...

    htmlparser2.0_dll+htmlparserAPI

    `HTMLParser-2[1].0-API.CHM`文件是HTMLParser2.0的API参考手册,它包含了详细的API文档,为开发者提供了如何使用这个库的指南。通过这个手册,开发者可以学习如何创建解析器实例,设置解析选项,注册事件处理器,...

    HTMLPARSER2.0 JDK包

    在"docs"这个压缩包文件中,我们可以预期找到HTMLPARSER 2.0的详细API文档、用户指南和其他相关资源。这些文档通常会按照类和方法进行组织,每个类或方法都有详细的解释,包括它们的作用、参数、返回值以及可能抛出...

    htmlparser

    - `HTMLparserDocs.chm`:这是HTMLparser的文档文件,通常包含API参考、示例代码和使用指南,帮助开发者了解如何使用这个库。 - `HTMLparser.cs`:这是库的核心文件,实现了HTML解析的主要功能。 - `TagParser.cs...

    跨平台的Html解析代码_武稀松_HtmlParser.rar

    1. "说明.txt" - 这可能是项目的基本使用指南,包含了如何集成和使用HtmlParser的详细步骤,以及可能的注意事项和最佳实践。 2. "idhttp 写了一个类似网页爬虫 发现内存一直再增大直到崩溃_解决方法用武稀松的html...

    htmlparser1_6

    4. **readme.txt**:这是一个重要的文本文件,通常包含项目的基本信息、安装指南、使用提示或开发者需要注意的事项。在这里,它可能概述了如何开始使用HTMLParser1_6项目,以及可能遇到的问题和解决方案。 5. **src...

    Winista.Htmlparser.rar

    Htmlparser.chm文件很可能是一个帮助文档,包含了关于Winista.Htmlparser库的详细说明、API参考、示例代码和使用指南。通常,CHM(Compiled Help Manual)文件是微软编译的帮助文件格式,用户可以通过它来查找库的...

    HtmlParser和HttpClient学习资料

    - HttpClient的使用指南:详述如何利用HttpClient发送HTTP请求并处理响应。 - 网络爬虫项目实例:提供完整的爬虫代码,供学习者参考和实践。 - 爬虫进阶话题:可能涵盖反爬虫策略、多线程爬虫、数据清洗等高级主题。...

    htmlParser javacc .jj文件

    虽然它主要与HTMLParser和JavaCC不是直接相关的,但Solr可以用来索引和搜索HTML内容,这可能是该压缩包中的文档提供了一个上下文,即如何使用HTMLParser和JavaCC处理HTML数据,然后将结果导入到Solr进行高效检索。...

    htmlparserv

    "使用说明.txt"文件很可能是HTMLParser的使用指南,里面应该包含了安装步骤、基本用法示例、API参考等信息,对于初次使用者非常有帮助。而"htmlparser1_6"可能是库文件的名称,表示这是HTMLParser的1.6版本。 总结...

    网络机器人编程指南(英文)

    - **网页解析技术**:利用Java库(如Jsoup、HTMLParser)解析HTML文档,提取所需数据。 - **链接抓取与管理**:如何自动发现网页上的链接,并根据一定的策略进行抓取。 - **反爬虫策略应对**:常见的反爬虫技术及其...

    C# HTML解析类库(含Demo,手册)

    手册则提供了详细的API文档和使用指南,帮助开发者深入理解库的各个功能。 7. **集成与扩展**:HTMLParser库通常可以轻松地与其他C#项目集成,如Web爬虫、Web应用或者桌面应用。它可能支持与流行的HTTP客户端库、...

    网页抓取资源包

    例如,可能会有一个Python脚本,使用BeautifulSoup或lxml库与HTMLParser配合,解析网页并提取所需数据;另一个脚本则可能利用jieba分词库对抓取的文本进行分词处理,生成适合分析的词汇列表。 在实际应用中,网页...

Global site tag (gtag.js) - Google Analytics