1. package model;
  2.  
  3. import java.io.BufferedReader;
  4. import java.io.File;
  5. import java.io.FileInputStream;
  6. import java.io.InputStreamReader;
  7. import java.util.HashSet;
  8. import java.util.Set;
  9. import org.apache.log4j.Logger;
  10. import org.htmlparser.Node;
  11. import org.htmlparser.NodeFilter;
  12. import org.htmlparser.Parser;
  13. import org.htmlparser.filters.NodeClassFilter;
  14. import org.htmlparser.filters.OrFilter;
  15. import org.htmlparser.tags.LinkTag;
  16. import org.htmlparser.util.NodeList;
  17. import org.htmlparser.util.ParserException;
  18.  
  19. /**
    *author:zeze
    **/
  20.  
  21. public class HtmlParserTool {
  22. private static Logger logger = Logger.getLogger(HtmlParserTool.class);
  23.  
  24. public Set<String> extracLinksByBody(String body,String url,LinkFilter filter,String enCode) {
  25. String host = getHost(url);
  26. Set<String> links = new HashSet<String>();
  27. try {
  28. //Parser parser = new Parser(url);
  29. Parser parser = null;
  30. try {
  31. //parser = Parser.createParser(body, enCode);
  32. parser = new Parser();
  33. parser.setInputHTML(body);
  34. parser.setEncoding(enCode);
  35.  
  36. } catch (NullPointerException e) {
  37. parser=null;
  38. logger.error(e);
  39. }
  40.  
  41. //parser.setEncoding("utf-8");
  42.  
  43. // 过滤 <frame >标签的 filter,用来提取 frame 标签里的 src 属性所表示的链接
  44. NodeFilter frameFilter = new NodeFilter() {
  45. public boolean accept(Node node) {
  46. if (node.getText().startsWith("frame src=")) {
  47. return true;
  48. } else {
  49. return false;
  50. }
  51. }
  52. };
  53. // OrFilter 来设置过滤 <a> 标签,和 <frame> 标签
  54. OrFilter linkFilter = new OrFilter(new NodeClassFilter(
  55. LinkTag.class), frameFilter);
  56. // 得到所有经过过滤的标签
  57. NodeList list = parser.extractAllNodesThatMatch(linkFilter);
  58. for (int i = 0; i < list.size(); i++) {
  59. Node tag = list.elementAt(i);
  60. if (tag instanceof LinkTag)// <a> 标签
  61. {
  62. LinkTag link = (LinkTag) tag;
  63. String linkUrl = link.getLink();// url
  64. //String title = link.getStringText();
  65. String title = link.getLinkText();
  66. title = title.trim();
  67. if(!linkUrl.startsWith("http://") && !linkUrl.startsWith("https://") ) {
  68. if(linkUrl.startsWith("/")){
  69. linkUrl = host+linkUrl;
  70. }else {
  71. linkUrl = host+ "/" + linkUrl;
  72. }
  73. }
  74. if(filter.accept(linkUrl))
  75. links.add(linkUrl);
  76. } else// <frame> 标签
  77. {
  78. // 提取 frame 里 src 属性的链接如 <frame src="test.html"/>
  79. String frame = tag.getText();
  80. int start = frame.indexOf("src=");
  81. frame = frame.substring(start);
  82. int end = frame.indexOf(" ");
  83. if (end == -1)
  84. end = frame.indexOf(">");
  85. String frameUrl = frame.substring(5, end - 1);
  86. if(filter.accept(frameUrl))
  87. links.add(frameUrl);
  88. }
  89. }
  90. parser=null;
  91. } catch (ParserException e) {
  92. //e.printStackTrace();
  93. logger.error(e);
  94. }
  95. return links;
  96. }
  97. private String getHost(String url) {
  98. int flag = -1;
  99. if(url.startsWith("http://")) {
  100. url = url.replace("http://", "");
  101. flag = 0;
  102. }
  103. if(url.startsWith("https://")) {
  104. url = url.replace("https://", "");
  105. flag = 1;
  106. }
  107. String host = "";
  108. int index = url.indexOf("/");
  109. if(index==-1) {
  110. host = url;
  111. } else {
  112. host = url.substring(0,index);
  113. }
  114. String addString = flag==1?"https://":"http://";
  115. host = addString + host;
  116. return host;
  117. }
  118.  
  119. public static String readTxtFile(String filePath,String enCode){
  120. String body="";
  121. try {
  122.  
  123. String encoding=enCode;
  124. File file=new File(filePath);
  125. if(file.isFile() && file.exists()){ //判断文件是否存在
  126. InputStreamReader read = new InputStreamReader(
  127. new FileInputStream(file),encoding);//考虑到编码格式
  128. BufferedReader bufferedReader = new BufferedReader(read);
  129. String lineTxt = null;
  130. while((lineTxt = bufferedReader.readLine()) != null){
  131. //System.out.println(lineTxt);
  132. body+=lineTxt;
  133. }
  134. read.close();
  135.  
  136. }else{
  137. System.out.println("找不到指定的文件");
  138. }
  139. } catch (Exception e) {
  140. System.out.println("读取文件内容出错");
  141. e.printStackTrace();
  142. }
  143. return body;
  144. }
  145.  
  146. public static void main(String[] args) {
  147. // TODO 自动生成的方法存根
  148. String startUrl = "http://weibo.cn";
  149. String body ="";
  150. HtmlParserTool htmlparser = new HtmlParserTool();
  151. body=readTxtFile("6.html","ISO8859-1");
  152. System.out.println(body);
  153.  
  154. /*String LongtextUrl="";
  155. System.out.println("var url = \"http://weibo.com");
  156. int indexOfLongtextUrlStringStart=body.indexOf("var url = \"http://weibo.com");
  157. int indexOfLongtextUrlStringEnd=-1;
  158. if( indexOfLongtextUrlStringStart>=0)
  159. {
  160. indexOfLongtextUrlStringEnd=body.indexOf("\";",indexOfLongtextUrlStringStart);
  161. if(indexOfLongtextUrlStringEnd>=0)
  162. {
  163. LongtextUrl=body.substring(indexOfLongtextUrlStringStart, indexOfLongtextUrlStringEnd);
  164. }
  165. }
  166. System.out.println(LongtextUrl);
  167. LongtextUrl=LongtextUrl.replaceAll("var url = \"", "");
  168. System.out.println(LongtextUrl);*/
  169.  
  170. /*Set<String> links = htmlparser.extracLinksByBody(body,startUrl,new LinkFilter()
  171. {
  172. //提取以 http://www.twt.edu.cn 开头的链接
  173. public boolean accept(String url) {
  174. //if(url.startsWith("http://www.sina.com.cn/"))
  175. return true;
  176. //else
  177. //return false;
  178. }
  179.  
  180. },"utf-8");
  181. for(String link : links)
  182. System.out.println(link);*/
  183. }
  184.  
  185. }

  

【爬虫】通用抽取网页URL的更多相关文章

  1. PHP实现简单爬虫-抓取网页url

    <?php /** * 爬虫程序 -- 原型 * * 从给定的url获取html内容 * * @param string $url * @return string */ function _g ...

  2. 新闻网页通用抽取器GNEv0.04版更新,支持提取正文图片与源代码

    GeneralNewsExtractor以下简称GNE是一个新闻网页通用抽取器,能够在不指定任何抽取规则的情况下,把新闻网站的正文提取出来. 我们来看一下它的基本使用方法. 安装 GNE 使用 pip ...

  3. (java)Jsoup爬虫学习--获取网页所有的图片,链接和其他信息,并检查url和文本信息

    Jsoup爬虫学习--获取网页所有的图片,链接和其他信息,并检查url和文本信息 此例将页面图片和url全部输出,重点不太明确,可根据自己的需要输出和截取: import org.jsoup.Jsou ...

  4. 爬虫_网页url设计

    为什么需要网页URL设计? 每个url不同的结构代表着不同的网页模块和信息的展现形式,为了方便维护与管理 网页url怎么设计? 分层: 主域名,子域名 一般形式为: 主域名:  www.job.com ...

  5. Python3简单爬虫抓取网页图片

    现在网上有很多python2写的爬虫抓取网页图片的实例,但不适用新手(新手都使用python3环境,不兼容python2), 所以我用Python3的语法写了一个简单抓取网页图片的实例,希望能够帮助到 ...

  6. python抽取指定url页面的title方法

    python抽取指定url页面的title方法 今天简单使用了一下python的re模块和lxml模块,分别利用的它们提供的正则表达式和xpath来解析页面源码从中提取所需的title,xpath在完 ...

  7. JavaScript如何获取网页url中的参数

    我们可以自定义一个公共函数来实现网页url中的参数获取,返回的是一个数组 GetUrlRequest: function () { var url = decodeURI(location.searc ...

  8. 获取网页URL地址及参数等的两种方法(js和C#)

    转:获取网页URL地址及参数等的两种方法(js和C#) 一 js 先看一个示例 用javascript获取url网址信息 <script type="text/javascript&q ...

  9. 可操纵网页URL地址的js插件-url.js

    url.js是一款能够很有用方便的操纵网页URL地址的js插件.通过url.js你能够设置和获取当前URL的參数,也能够对当前URL的參数进行更新.删除操作.还能够将当前URL的參数显示为json字符 ...

随机推荐

  1. 关于Ubantu下使用cshell的问题解决

    在一个新创建的目录下使用cshell,直接在/etc/passwd 下对应的用户后 bash改为csh; 之后运行发现报错,后来查找发现/bin下没有csh执行脚本,之后安装csh;; 参考了http ...

  2. TCP三次握手连接

    在TCP/IP协议中,TCP协议提供可靠的连接服务,采用三次握手建立一个连接. 第一次握手:建立连接时,客户端发送syn包(syn=j)到服务器,并进入SYN_SEND状态,等待服务器确认: 第二次握 ...

  3. 【ASP.NET】@Model类型的使用详解

    有时需要在ASP.NET MVC4的视图的@model中使用多个类型的实例,.NET Framework 4.0版本引入的System.Tuple类可以轻松满足这个需求. 假设Person和Produ ...

  4. 技术的正宗与野路子 c#, AOP动态代理实现动态权限控制(一) 探索基于.NET下实现一句话木马之asmx篇 asp.net core 系列 9 环境(Development、Staging 、Production)

    黄衫女子的武功似乎与周芷若乃是一路,飘忽灵动,变幻无方,但举手抬足之间却是正而不邪,如说周芷若形似鬼魅,那黄衫女子便是态拟神仙. 这段描写出自<倚天屠龙记>第三十八回. “九阴神抓”本是& ...

  5. Android视频播放和横竖屏切换

    最近做了一个项目,里面用到了视频播放这一块,当时想考虑Vitamio,demo也做了出来,但是后来发现它是商业收费的,并且收费相当可观,所以只能放弃了.然后找到了ijkPlayer,功能也很强大,最终 ...

  6. Groovy 学习手册(5)

    8. 函数式编程 函数式编程(FP)是一种编程风格,侧重于函数和最小化状态的变化(使用不可变的数据结构).它更接近于用数学来表达解决方案,而不是循序渐进的操作. 在函数式编程里,其功能应该是" ...

  7. IAR for stm8 memory窗口的功能

    进入debug模式后点击菜单view-Memory 可以在线查看,RAM,FLASH,OPTION等

  8. MPU6050陀螺仪和加速度计的校准

    加速度计和陀螺仪的校准: 在传感器静止不动水平放置时,测出陀螺仪和加速度计各轴的偏移值,保存.以后每次上电调用dmp_set_xx_bias()就行了. u8 run_self_test(void) ...

  9. 温故而知新 Vue 原来也有this.$forceUpdate();

    由于一些嵌套特别深的数据,导致数据更新了.UI没有更新(连深度监听都没有监听到),我捉摸着有没有和react一样的立即更新UI的API呢 this.forceUpdate()呢?结果还真有: this ...

  10. 从ext4将mysql数据目录移动至lustre出现(InnoDB: Unable to lock ./ibdata1, error: 38.)

    因为数据目录过大,因此我把目录从本地移到了共享存储中.在修改了/etc/my.cnf和/etc/init.d/mysqld之后发现数据库可以运行,但启动速度很慢 原因是原文件系统是ext4,而目标文件 ...