package model;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStreamReader;
import java.util.HashSet;
import java.util.Set;
import org.apache.log4j.Logger;
import org.htmlparser.Node;
import org.htmlparser.NodeFilter;
import org.htmlparser.Parser;
import org.htmlparser.filters.NodeClassFilter;
import org.htmlparser.filters.OrFilter;
import org.htmlparser.tags.LinkTag;
import org.htmlparser.util.NodeList;
import org.htmlparser.util.ParserException; /**
*author:zeze
**/ public class HtmlParserTool {
private static Logger logger = Logger.getLogger(HtmlParserTool.class); public Set<String> extracLinksByBody(String body,String url,LinkFilter filter,String enCode) {
String host = getHost(url);
Set<String> links = new HashSet<String>();
try {
//Parser parser = new Parser(url);
Parser parser = null;
try {
//parser = Parser.createParser(body, enCode);
parser = new Parser();
parser.setInputHTML(body);
parser.setEncoding(enCode); } catch (NullPointerException e) {
parser=null;
logger.error(e);
} //parser.setEncoding("utf-8"); // 过滤 <frame >标签的 filter,用来提取 frame 标签里的 src 属性所表示的链接
NodeFilter frameFilter = new NodeFilter() {
public boolean accept(Node node) {
if (node.getText().startsWith("frame src=")) {
return true;
} else {
return false;
}
}
};
// OrFilter 来设置过滤 <a> 标签,和 <frame> 标签
OrFilter linkFilter = new OrFilter(new NodeClassFilter(
LinkTag.class), frameFilter);
// 得到所有经过过滤的标签
NodeList list = parser.extractAllNodesThatMatch(linkFilter);
for (int i = 0; i < list.size(); i++) {
Node tag = list.elementAt(i);
if (tag instanceof LinkTag)// <a> 标签
{
LinkTag link = (LinkTag) tag;
String linkUrl = link.getLink();// url
//String title = link.getStringText();
String title = link.getLinkText();
title = title.trim();
if(!linkUrl.startsWith("http://") && !linkUrl.startsWith("https://") ) {
if(linkUrl.startsWith("/")){
linkUrl = host+linkUrl;
}else {
linkUrl = host+ "/" + linkUrl;
}
}
if(filter.accept(linkUrl))
links.add(linkUrl);
} else// <frame> 标签
{
// 提取 frame 里 src 属性的链接如 <frame src="test.html"/>
String frame = tag.getText();
int start = frame.indexOf("src=");
frame = frame.substring(start);
int end = frame.indexOf(" ");
if (end == -1)
end = frame.indexOf(">");
String frameUrl = frame.substring(5, end - 1);
if(filter.accept(frameUrl))
links.add(frameUrl);
}
}
parser=null;
} catch (ParserException e) {
//e.printStackTrace();
logger.error(e);
}
return links;
}
private String getHost(String url) {
int flag = -1;
if(url.startsWith("http://")) {
url = url.replace("http://", "");
flag = 0;
}
if(url.startsWith("https://")) {
url = url.replace("https://", "");
flag = 1;
}
String host = "";
int index = url.indexOf("/");
if(index==-1) {
host = url;
} else {
host = url.substring(0,index);
}
String addString = flag==1?"https://":"http://";
host = addString + host;
return host;
} public static String readTxtFile(String filePath,String enCode){
String body="";
try { String encoding=enCode;
File file=new File(filePath);
if(file.isFile() && file.exists()){ //判断文件是否存在
InputStreamReader read = new InputStreamReader(
new FileInputStream(file),encoding);//考虑到编码格式
BufferedReader bufferedReader = new BufferedReader(read);
String lineTxt = null;
while((lineTxt = bufferedReader.readLine()) != null){
//System.out.println(lineTxt);
body+=lineTxt;
}
read.close(); }else{
System.out.println("找不到指定的文件");
}
} catch (Exception e) {
System.out.println("读取文件内容出错");
e.printStackTrace();
}
return body;
} public static void main(String[] args) {
// TODO 自动生成的方法存根
String startUrl = "http://weibo.cn";
String body ="";
HtmlParserTool htmlparser = new HtmlParserTool();
body=readTxtFile("6.html","ISO8859-1");
System.out.println(body); /*String LongtextUrl="";
System.out.println("var url = \"http://weibo.com");
int indexOfLongtextUrlStringStart=body.indexOf("var url = \"http://weibo.com");
int indexOfLongtextUrlStringEnd=-1;
if( indexOfLongtextUrlStringStart>=0)
{
indexOfLongtextUrlStringEnd=body.indexOf("\";",indexOfLongtextUrlStringStart);
if(indexOfLongtextUrlStringEnd>=0)
{
LongtextUrl=body.substring(indexOfLongtextUrlStringStart, indexOfLongtextUrlStringEnd);
}
}
System.out.println(LongtextUrl);
LongtextUrl=LongtextUrl.replaceAll("var url = \"", "");
System.out.println(LongtextUrl);*/ /*Set<String> links = htmlparser.extracLinksByBody(body,startUrl,new LinkFilter()
{
//提取以 http://www.twt.edu.cn 开头的链接
public boolean accept(String url) {
//if(url.startsWith("http://www.sina.com.cn/"))
return true;
//else
//return false;
} },"utf-8");
for(String link : links)
System.out.println(link);*/
} }

  

【爬虫】通用抽取网页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. protobuf3 iOS 接入 protobuf

    1.引入官方基础pod 谷歌将protobuf需要使用的基础类封装成了一个pod,因此可以直接安装该pod,不必再手工导入. 如下: pod "Protobuf", :git =& ...

  2. ReactiveCocoa 5.0 初次了解

    RAC 5.0 相比于 4.0 有了巨大的变化,不仅是受 swift 3.0 大升级的影响,RAC 对自身项目结构的也进行了大幅度的调整.这个调整就是将 RAC 拆分为四个库:ReactiveCoco ...

  3. 我收藏的技术知识图(每张都是大图)关于XX背后的知识、技术图,例如:Linux、Nginx架构、PHP知识卡、机会、HTML5移动、Android系统架构、YII架构的典型流程、Css知识表

    我收藏的技术知识图(每张都是大图) HTML5Linux/Unix系统设计思想读书笔记 LinuxMVCJava线程MVCSpring MVCCSS3Nginx架构VimCliCommandsPHP知 ...

  4. C#编写的服务程序启动服务时报错误1053

    Application.StartupPath 已知解决方案一:        读写文件路径的问题 用 $"{Application.StartupPath}\\config.txt&quo ...

  5. 替换SQL字段中的换行符,回车符

    替换SQL字段中的换行符,回车符: 在富文本内容中通常会出现回车.换行内容.在sql数据库中这些回车.换行符,输出html后,表现为空格. 这里是在数据导出.导入中发现的,通常把回车.换行符找出来,用 ...

  6. OpenCV 学习笔记 01 安装OpenCV及相关依赖库

    本次学习是基于Window10进行的.语言为python3. 1 与opencv相关的库简介 1.1 numpy numpy 是 OpenCV 绑定 python 时所依赖的库,此意味着numpy在安 ...

  7. windows开机后键盘失灵(非硬件原因)解决办法

    今天来了,开机时突然发现输入密码时,键盘不管用了,试了一下键盘没问题,插口也没问题,能进入安全模式,很奇怪,昨天好好的今天却不能用了,找人倒腾了大半天也没搞出来,后来用PE盘消掉了密码,总算进入了系统 ...

  8. mac mini 制作fusion drive 的方法

    下载yosemite,格式化磁盘,运行如下命令,制作os x 启动盘   sudo /Applications/Install\ OS\ X\ Yosemite.app/Contents/Resour ...

  9. Java服务端单元测试指南

    https://juejin.im/entry/5acad0806fb9a028cd456236

  10. 我是跨域的JSONP

    1.出现原因:因为web中的同源策略(域名,协议,端口号)限制了跨域访问.   2.区别于json (个人理解)json是数据交换格式,jsonp是数据通信中的交互方式   3.jsonp的get与p ...