htmlparser实现爬虫_第1页
htmlparser实现爬虫_第2页
htmlparser实现爬虫_第3页
htmlparser实现爬虫_第4页
htmlparser实现爬虫_第5页
免费预览已结束,剩余36页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、 package parser;import java.io.BufferedReader;import java.io.BufferedWriter;import java.io.FileWriter;import java.io.IOException;import java.io.InputStream;import java.io.InputStreamReader;import .MalformedURLException;import .URL;/* * 基本能实现网页抓取,不过要手动输入URL 将整个html内容保存到指定文件 * * author chenguoyong * *

2、/public class ScrubSelectedWeb private final static String CRLF = System.getProperty("line.separator");/* * param args */public static void main(String args) try URL ur = new URL("99:8083/injs100/");InputStream instr = ur.openStream();String s, str;BufferedReade

3、r in = new BufferedReader(new InputStreamReader(instr);StringBuffer sb = new StringBuffer();BufferedWriter out = new BufferedWriter(new FileWriter("D:/outPut.txt");while (s = in.readLine() != null) sb.append(s + CRLF);System.out.println(sb);str = new String(sb);out.write(str);out.close();i

4、n.close(); catch (MalformedURLException e) e.printStackTrace(); catch (IOException e) e.printStackTrace();基本能实现网页抓取,不过要手动输入URL,此外没有重构。只是一个简单的思路。1.htmlparser 使用htmlparser是一个纯的java写的html解析的库,htmlparser不依赖于其它的java库,htmlparser主要用于改造 或提取html。htmlparser能超高速解析html,而且不会出错。毫不夸张地说,htmlparser就是目前最好的html解 析和分析的

5、工具。无论你是想抓取网页数据还是改造html的内容,用了htmlparser绝对会忍不住称赞。由于htmlparser 结构设计精良,所以扩展htmlparser 非常便利。Htmlparser中文论坛.  Constructor SummaryParser()Parser(URLConnection connection)           Construct a parser using the provided URLConnection.Method:st

6、atic ParsercreateParser(String html, String charset)           Creates the parser on an input string. voidvisitAllNodesWith(NodeVisitor visitor)           Apply the given visi

7、tor to the current page.HtmlPage(Parser parser) NodeListgetBody()             TableTaggetTables()             StringgetTitle()        &

8、#160;    voidsetTitle(String title)             voidvisitTag(Tag tag)           Called for each Tag visited. Constructor SummaryNodeList()   

9、0;        NodeList(Node node)           Create a one element node list.  NodeListextractAllNodesThatMatch(NodeFilter filter)           Filte

10、r the list with the given filter non-recursively.  NodeListextractAllNodesThatMatch(NodeFilter filter, boolean recursive)           Filter the list with the given filter. NodeelementAt(int i)1. html代码里面所有的链接地址和链接名称package par

11、ser;import org.htmlparser.Parser;import org.htmlparser.Node;import org.htmlparser.NodeFilter;import org.htmlparser.Parser;import org.htmlparser.filters.TagNameFilter;import org.htmlparser.tags.LinkTag;import org.htmlparser.tags.TableTag;import org.htmlparser.util.NodeList;import org.htmlparser.util.

12、ParserException;import org.htmlparser.visitors.HtmlPage;/* * htmlparser取得一段html代码里面所有的链接地址和链接名称 * * author chenguoyong * */public class Testhtmlparser /* * param args */public static void main(String args) String htmlcode = "<HTML><HEAD><TITLE>AAA</TITLE></HEAD><

13、;BODY>"+ "<a href='+ "<a href=''>连接2</a></BODY></HTML>"/ 创建Parser对象根据传给字符串和指定的编码Parser parser = Parser.createParser(htmlcode, "GBK");/ 创建HtmlPage对象HtmlPage(Parser parser)HtmlPage page = new HtmlPage(parser);try / HtmlPage extend

14、s visitor,Apply the given visitor to the current/ page.parser.visitAllNodesWith(page); catch (ParserException e1) e1 = null;/ 所有的节点NodeList nodelist = page.getBody();/ 建立一个节点filter用于过滤节点NodeFilter filter = new TagNameFilter("A");/ 得到所有过滤后,想要的节点nodelist = nodelist.extractAllNodesThatMatch(f

15、ilter, true);for (int i = 0; i < nodelist.size(); i+) LinkTag link = (LinkTag) nodelist.elementAt(i);/ 链接地址System.out.println(link.getAttribute("href") + "n");/ 链接名称System.out.println(link.getStringText();结果如下:连接1连接22. 使用HtmlParser抓去网页内容package parser;import org.htmlparser.Par

16、ser;import org.htmlparser.beans.StringBean;import org.htmlparser.filters.NodeClassFilter;import org.htmlparser.parserapplications.StringExtractor;import org.htmlparser.tags.BodyTag;import org.htmlparser.util.NodeList;import org.htmlparser.util.ParserException;/* * 使用HtmlParser抓去网页内容: 要抓去页面的内容最方便的方法就

17、是使用StringBean. 里面有几个控制页面内容的几个参数. * 在后面的代码中会有说明. Htmlparser包中还有一个示例StringExtractor 里面有个直接得到内容的方法, * 其中也是使用了StringBean . 另外直接解析Parser的每个标签也可以的. * * author chenguoyong * */public class GetContent public void getContentUsingStringBean(String url) StringBean sb = new StringBean();sb.setLinks(true); / 是否显

18、示web页面的连接(Links)/ 为了取得页面的整洁美观一般设置上面两项为true , 如果要保持页面的原有格式, 如代码页面的空格缩进 可以设置为falsesb.setCollapse(true); / 如果是true的话把一系列空白字符用一个字符替代.sb.setReplaceNonBreakingSpaces(true);/ If true regular spacesb.setURL("System.out.println("The Content is :n" + sb.getStrings();public void getContentUsingS

19、tringExtractor(String url, boolean link) / StringExtractor内部机制和上面的一样.做了一下包装StringExtractor se = new StringExtractor(url);String text = null;try text = se.extractStrings(link);System.out.println("The content is :n" + text); catch (ParserException e) e.printStackTrace();public void getConten

20、tUsingParser(String url) NodeList nl;try Parser p = new Parser(url);nl = p.parse(new NodeClassFilter(BodyTag.class);BodyTag bt = (BodyTag) nl.elementAt(0);System.out.println(bt.toPlainTextString(); / 保留原来的内容格式. 包含js代码 catch (ParserException e) e.printStackTrace();/* * param args */public static void

21、 main(String args) String url = "/new GetContent().getContentUsingParser(url);/-new GetContent().getContentUsingStringBean(url);3.将整个html内容保存到指定文件package parser;import java.io.BufferedReader;import java.io.BufferedWriter;import java.io.FileWriter;import java.io.IOException;import java.io.InputS

22、tream;import java.io.InputStreamReader;import .MalformedURLException;import .URL;/* * 基本能实现网页抓取,不过要手动输入URL 将整个html内容保存到指定文件 * * author chenguoyong * */public class ScrubSelectedWeb private final static String CRLF = System.getProperty("line.separator");/* * param args */public static void

23、main(String args) try URL ur = new URL("InputStream instr = ur.openStream();String s, str;BufferedReader in = new BufferedReader(new InputStreamReader(instr);StringBuffer sb = new StringBuffer();BufferedWriter out = new BufferedWriter(new FileWriter("D:/outPut.txt");while (s = in.read

24、Line() != null) sb.append(s + CRLF);System.out.println(sb);str = new String(sb);out.write(str);out.close();in.close(); catch (MalformedURLException e) e.printStackTrace(); catch (IOException e) e.printStackTrace();4利用htmlparser提取网页纯文本的例子package parser;import org.htmlparser.Node;import org.htmlparser

25、.NodeFilter;import org.htmlparser.Parser;import org.htmlparser.filters.TagNameFilter;import org.htmlparser.tags.TableTag;import org.htmlparser.util.NodeList;/* * 标题:利用htmlparser提取网页纯文本的例子 */public class TestHTMLParser2 /* * 读取目标html内容 * */public static void testHtml() try String sCurrentLine;String

26、sTotalString;sCurrentLine = ""sTotalString = ""java.io.InputStream l_urlStream;.URL l_url = new .URL("99:8083/injs100/");.HttpURLConnection l_connection = (.HttpURLConnection) l_url.openConnection();l_connection.connect();l_urlStream = l_connection.get

27、InputStream();java.io.BufferedReader l_reader = new java.io.BufferedReader(new java.io.InputStreamReader(l_urlStream);while (sCurrentLine = l_reader.readLine() != null) sTotalString += sCurrentLine + "rn"String testText = extractText(sTotalString); catch (Exception e) e.printStackTrace();

28、/* * 抽取纯文本信息 * param inputHtml:html文本 * return * throws Exception */public static String extractText(String inputHtml) throws Exception StringBuffer text = new StringBuffer();Parser parser = Parser.createParser(new String(inputHtml.getBytes(),"GBK"), "GBK");/ 遍历所有的节点NodeList node

29、s = parser.extractAllNodesThatMatch(new NodeFilter() public boolean accept(Node node) return true;);System.out.println(nodes.size();for (int i = 0; i < nodes.size(); i+) Node nodet = nodes.elementAt(i);/字符串的代表性节点:节点的描述text.append(new String(nodet.toPlainTextString().getBytes("GBK")+ &qu

30、ot;rn");return text.toString(); /* * 读取文件的方式/utl 来分析内容. filePath也可以是一个Url. * param resource :文件/Url * throws Exception */public static void test5(String resource) throws Exception Parser myParser = new Parser(resource);myParser.setEncoding("GBK");String filterStr = "table"No

31、deFilter filter = new TagNameFilter(filterStr);NodeList nodeList = myParser.extractAllNodesThatMatch(filter);/*for(int i=0;i<nodeList.size();i+)TableTag tabletag = (TableTag) nodeList.elementAt(i);/标签名称System.out.println(tabletag.getTagName();System.out.println(tabletag.getText();*/TableTag table

32、tag = (TableTag) nodeList.elementAt(1);public static void main(String args) throws Exception test5("99:8083/injs100/");/testHtml();5.html解析tablepackage parser;import org.apache.log4j.Logger;import org.htmlparser.NodeFilter;import org.htmlparser.Parser;import org.htmlparse

33、r.filters.NodeClassFilter;import org.htmlparser.filters.OrFilter;import org.htmlparser.filters.TagNameFilter;import org.htmlparser.tags.TableColumn;import org.htmlparser.tags.TableRow;import org.htmlparser.tags.TableTag;import org.htmlparser.util.NodeList;import org.htmlparser.util.ParserException;i

34、mport junit.framework.TestCase;public class ParserTestCase extends TestCase private static final Logger logger = Logger.getLogger(ParserTestCase.class);public ParserTestCase(String name) super(name);/* * 测试对<table> * <tr> * <td></td> * </tr> * </table>的解析 */public

35、 void testTable() Parser myParser;NodeList nodeList = null;myParser = Parser.createParser("<body> "+ "<table id=table1 >"+ "<tr id='tro1'><td>1-11</td><td>1-12</td><td>1-13</td></tr>"+ "<tr id=&

36、#39;tro2'><td>1-21</td><td>1-22</td><td>1-23</td></tr>"+ "<tr id='tro3'><td>1-31</td><td>1-32</td><td>1-33</td></tr></table>"+ "<table id=table2 >"+ "<

37、;tr id='tro4'><td>2-11</td><td>2-12</td><td>2-13</td></tr>"+ "<tr id='tro5'><td>2-21</td><td>2-22</td><td>2-23</td></tr>"+ "<tr id='tro6'><td>2-31</

38、td><td>2-32</td><td>2-33</td></tr></table>"+ "</body>", "GBK");NodeFilter tableFilter = new NodeClassFilter(TableTag.class);OrFilter lastFilter = new OrFilter();lastFilter.setPredicates(new NodeFilter tableFilter );try nodeList =

39、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) rowsj;System.out.println(tr.getAttribu

40、te("id");if (tr.getAttribute("id").equalsIgnoreCase("tro1") TableColumn td = tr.getColumns();for (int k = 0; k < td.length; k+) / logger.fatal("<td>" +/ tdk.toPlainTextString();System.out.println("<td>"+ tdk.toPlainTextString(); catch

41、(ParserException e) e.printStackTrace();/* * 得到目标数据 * * param url:目标url * throws Exception */public static void getDatabyUrl(String url) throws Exception Parser myParser = new Parser(url);NodeList nodeList = null;myParser.setEncoding("gb2312");NodeFilter tableFilter = new NodeClassFilter(T

42、ableTag.class);OrFilter lastFilter = new OrFilter();lastFilter.setPredicates(new NodeFilter tableFilter );try nodeList = myParser.parse(lastFilter);/ 可以从数据table的size:19-21开始到结束for (int i = 15; i <= nodeList.size(); i+) if (nodeList.elementAt(i) instanceof TableTag) TableTag tag = (TableTag) nodeL

43、ist.elementAt(i);TableRow rows = tag.getRows();for (int j = 0; j < rows.length; j+) TableRow tr = (TableRow) rowsj;if (tr.getAttribute("id") != null&& tr.getAttribute("id").equalsIgnoreCase("tr02") TableColumn td = tr.getColumns();/ 对不起,没有你要查询的记录!if (td.lengt

44、h = 1) System.out.println("对不起,没有你要查询的记录"); else for (int k = 0; k < td.length; k+) System.out.println("<td>内容:"+ tdk.toPlainTextString().trim(); catch (ParserException e) e.printStackTrace();/* * 测试已经得出有数据时table:22个,没有数据时table:19个 * * param args */public static void mai

45、n(String args) try / getDatabyUrl("getDatabyUrl(" catch (Exception e) e.printStackTrace();6.html解析常用package com.jscud.test;import java.io.BufferedReader;import java.io.File;import java.io.FileInputStream;import java.io.InputStreamReader;import org.htmlparser.Node;import org.htmlparser.Node

46、Filter;import org.htmlparser.Parser;import org.htmlparser.filters.NodeClassFilter;import org.htmlparser.filters.OrFilter;import org.htmlparser.nodes.TextNode;import org.htmlparser.tags.LinkTag;import org.htmlparser.util.NodeList;import org.htmlparser.util.ParserException;import org.htmlparser.visito

47、rs.HtmlPage;import org.htmlparser.visitors.TextExtractingVisitor;import com.jscud.util.LogMan; /一个日志记录类/* 演示了Html Parse的应用.* * author scud (*/public class ParseHtmlTestpublic static void main(String args) throws ExceptionString aFile = "e:/jscud/temp/test.htm"String content = readTextFile(

48、aFile, "GBK");test1(content);System.out.println("=");test2(content);System.out.println("=");test3(content);System.out.println("=");test4(content);System.out.println("=");test5(aFile);System.out.println("=");/访问外部资源,相对慢test5(" ( System.

49、out.println("=");/* 读取文件的方式来分析内容.* filePath也可以是一个Url.* * param resource 文件/Url*/public static void test5(String resource) throws ExceptionParser myParser = new Parser(resource);/设置编码myParser.setEncoding("GBK");HtmlPage visitor = new HtmlPage(myParser);myParser.visitAllNodesWith(v

50、isitor);String textInPage = visitor.getTitle();System.out.println(textInPage);/* 按页面方式处理.对一个标准的Html页面,推荐使用此种方式.*/public static void test4(String content) throws ExceptionParser myParser;myParser = Parser.createParser(content, "GBK");HtmlPage visitor = new HtmlPage(myParser);myParser.visitA

51、llNodesWith(visitor);String textInPage = visitor.getTitle();System.out.println(textInPage);/* 利用Visitor模式解析html页面.* 小优点:翻译了<>等符号 * 缺点:好多空格,无法提取link* */public static void test3(String content) throws ExceptionParser myParser;myParser = Parser.createParser(content, "GBK");TextExtractin

52、gVisitor visitor = new TextExtractingVisitor();myParser.visitAllNodesWith(visitor);String textInPage = visitor.getExtractedText();System.out.println(textInPage);/* 得到普通文本和链接的内容.* * 使用了过滤条件.*/public static void test2(String content) throws ParserExceptionParser myParser;NodeList nodeList = null;myPar

53、ser = Parser.createParser(content, "GBK");NodeFilter textFilter = new NodeClassFilter(TextNode.class);NodeFilter linkFilter = new NodeClassFilter(LinkTag.class);/暂时不处理 meta/NodeFilter metaFilter = new NodeClassFilter(MetaTag.class);OrFilter lastFilter = new OrFilter();lastFilter.setPredica

54、tes(new NodeFilter textFilter, linkFilter );nodeList = myParser.parse(lastFilter);Node nodes = nodeList.toNodeArray();for (int i = 0; i < nodes.length; i+)Node anode = (Node) nodesi;String line = ""if (anode instanceof TextNode)TextNode textnode = (TextNode) anode;/line = textnode.toPlainTextString()

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论