版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
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;BufferedReader
3、 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();in
4、.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
6、:static Parser createParser(String html, String charset) Creates the parser on an input string. void visitAllNodesWith(NodeVisitor visitor) Apply the given
7、 visitor 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、; NodeList(Node node) Create a one element node list. NodeList extractAllNodesThatMatch(NodeFilter filter)
10、;Filter the list with the given filter non-recursively. NodeList extractAllNodesThatMatch(NodeFilter filter, boolean recursive) Filter the list with the given filter. Node elementAt(int i)1. html代码里面所有的链接地址和链接名称pac
11、kage parser;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.htmlpars
12、er.util.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></HEA
13、D><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 / HtmlPag
14、e extends 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.extractAllNodesTha
15、tMatch(filter, 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.htmlpa
16、rser.Parser;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 getConte
19、ntUsingStringExtractor(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 g
20、etContentUsingParser(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 sta
21、tic void 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.i
22、o.InputStream;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 stat
23、ic void 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 =
24、 in.readLine() != 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.ht
25、mlparser.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
26、;String 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_connec
27、tion.getInputStream();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.printStackT
28、race(); /* * 抽取纯文本信息 * 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");/ 遍历所有的节点NodeL
29、ist nodes = 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&quo
30、t;)+ "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
31、"NodeFilter 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();*/TableT
32、ag tabletag = (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.h
33、tmlparser.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.ParserExc
34、eption;import 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>的解析
35、*/public 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>"+ "<
36、;tr id='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、quot;<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
38、-31</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 nod
39、eList = 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.ge
40、tAttribute("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()
41、; catch (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 NodeClass
42、Filter(TableTag.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 = (TableTa
43、g) nodeList.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 (
44、td.length = 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
45、void main(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.htmlpar
46、ser.NodeFilter;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.htmlparse
47、r.visitors.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 = readT
48、extFile(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(" (
49、 System.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.visitAllNod
50、esWith(visitor);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);myParse
51、r.visitAllNodesWith(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");TextE
52、xtractingVisitor 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 = nu
53、ll;myParser = 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.setPredicates(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 = textn
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025榆林市横山区艾好峁卫生院招聘(4人)模拟笔试试题及答案解析
- 2025年甘肃省天水市秦州区眼科医院招聘超声影像工作人员备考考试试题及答案解析
- 2025广西百色平果市发展和改革局城镇公益性岗位人员招聘1人考试参考试题及答案解析
- 深度解析(2026)《GBT 26006-2010船用铝合金挤压管、棒、型材》
- 2026云南昆明市官渡区矣六街道办事处招聘7人参考考试试题及答案解析
- 深度解析(2026)《GBT 25911-2010信息技术 藏文编码字符集 24×48点阵字型 朱匝体》
- 2025河北邢台市人民医院招聘编外工作人员41人备考笔试试题及答案解析
- 2025西安交通大学第一附属医院医学影像科招聘劳务派遣助理护士备考考试试题及答案解析
- 深度解析(2026)《GBT 25815-2010酸性红NM-3BL(C.I.酸性红414)》
- 深度解析(2026)《GBT 25765-2010滚动轴承 汽车变速箱用球轴承》(2026年)深度解析
- 2025秋人教版(新教材)初中美术八年级上册知识点及期末测试卷及答案
- 2026年保安员考试题库500道附完整答案(历年真题)
- 2025至2030中国司法鉴定行业发展研究与产业战略规划分析评估报告
- (2025年)危重病人的观察与护理试题及答案
- 膝关节韧带损伤康复课件
- 医药区域经理述职报告
- 建筑施工项目职业病危害防治措施方案
- 船员上船前安全培训课件
- 袖阀注浆管施工方案
- 中职思政一年级“中国特色社会主义”期末考试试卷
- GB/T 18370-2014玻璃纤维无捻粗纱布
评论
0/150
提交评论