本文参考:李腾飞CSM实战
使用正则表达式来分析网页的内容比较麻烦,因为html标签不区分大小写,而且有的时候没有结尾。
HtmlParser也有下载网页的功能,不过他不是专门用来做这个,所以我们这边不用他的这个功能。
具体内容请看下面代码及注释:
public class PageParserTest extends TestCase {
private String localFile="d:/temp.html";
//使用httpChient来获取一个本地网页
public void testFetch01() {
try {
// HttpClient主要负责执行请求,可以把它看做是一个浏览器
HttpClient httpclient = new DefaultHttpClient();
// 利用HTTP GET向服务器发起请求
HttpGet get = new HttpGet("http://www.ibm.com/developerworks/cn/java/j-javaroundtable/index.html");
// 获得服务器响应的的所有信息
HttpResponse response = httpclient.execute(get);
// 获得服务器响应回来的消息体(不包括HTTP HEAD)
HttpEntity entity = response.getEntity();
if (entity != null) {
// 获得响应的字符集编码信息
// 即获取HTTP HEAD的:Content-Type:text/html;charset=UTF-8中的字符集信息
String charset = EntityUtils.getContentCharSet(entity);
InputStream is = entity.getContent();
IOUtils.copy(is, new FileOutputStream(localFile));
}
// 释放所有的链接资源,一般在所有的请求处理完成之后,才需要释放
httpclient.getConnectionManager().shutdown();
} catch (ClientProtocolException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
//使用HttpParser来提取网页中的图片链接地址
public void testParse01() throws Exception{
//把文件的内容读出来
String html= IOUtils.toString(new FileInputStream(localFile),"UTF-8");
//创建一个html解释器
Parser parser=new Parser();
parser.setInputHTML(html);
//提取所有<img>标签的地址
NodeList imageTags=parser.parse(new NodeClassFilter(ImageTag.class ));
for(int i=0;i<imageTags.size();i++){
ImageTag it=(ImageTag) imageTags.elementAt(i);
String imageUrl=it.getImageURL();
System.out.println(imageUrl);
}
}
//提取具有某种特征的标签
public void testParse02() throws Exception{
//把文件的内容读出来
String html= IOUtils.toString(new FileInputStream(localFile),"UTF-8");
//创建一个html解释器
Parser parser=new Parser();
parser.setInputHTML(html);
//提取name="title"的meta标签
NodeList metaTags=parser.parse(
new NodeFilter(){
@Override
public boolean accept(Node node) {
if(node instanceof MetaTag){
MetaTag mt=(MetaTag) node;
if(mt.getMetaTagName()!=null && mt.getMetaTagName().equals("title")){
return true;
}
}
return false;
}
}
);
for(int i=0; i<metaTags.size();i++){
MetaTag mt=(MetaTag) metaTags.elementAt(i);
System.out.println("文章的标题是:"+mt.getMetaContent());
}
}
//提取文章的简介和关键字
public void testParse03() throws Exception{
//把文件的内容读出来
String html= IOUtils.toString(new FileInputStream(localFile),"UTF-8");
MetaTag metaTag=ParseUtils.parseTag(html, MetaTag.class, "name", "Abstract");
System.out.println("文章的简介是:"+metaTag.getMetaContent());
metaTag=ParseUtils.parseTag(html, MetaTag.class, "name", "Keywords");
System.out.println("文章的关键字是:"+metaTag.getMetaContent());
}
//提取文章的作者信息
public void testParse04() throws Exception{
//把文件的内容读出来
String html= IOUtils.toString(new FileInputStream(localFile),"UTF-8");
List<Div> authors=ParseUtils.parseTags(html, Div.class, "class", "author");
for (Div div : authors) {
System.out.println(ParseUtils.parseTag(div.getStringText(), LinkTag.class).getStringText());
}
}
//提取文章的内容
public void testParse05() throws Exception{
//把文件的内容读出来
String html= IOUtils.toString(new FileInputStream(localFile),"UTF-8");
String content=StringUtils.substringBetween(html, "<!-- MAIN_COLUMN_BEGIN -->", "<!-- CMA");
System.out.println(content);
}
//把文章内容中的图片下载到本地
@Test
public void testParse06() throws Exception{
HttpClient httpClient=new DefaultHttpClient();
//把文件的内容读出来
String html= IOUtils.toString(new FileInputStream(localFile),"UTF-8");
String content=StringUtils.substringBetween(html, "<!-- MAIN_COLUMN_BEGIN -->", "<!-- CMA");
//提取内容中的图片信息
Parser parser=new Parser();
parser.setInputHTML(content);
//提取所有<img>标签的地址
NodeList imageTags=parser.parse(new NodeClassFilter(ImageTag.class ));
for(int i=0;i<imageTags.size();i++){
ImageTag it=(ImageTag) imageTags.elementAt(i);
String imageUrl=it.getImageURL();
String imageName=FilenameUtils.getName(imageUrl);
System.out.println(imageUrl);
String url="http://www.ibm.com/developerworks/cn/java/j-javaroundtable/"+imageUrl;
byte[] image=HttpUtils.getImage(httpClient, url);
//存储到本地的某个磁盘
IOUtils.write(image, new FileOutputStream("d:/temp/"+imageName));
}
httpClient.getConnectionManager().shutdown();
}
}
ParseUtils类:
public class ParseUtils {
/**
* 提取具有某个属性值的标签列表
* @param html 被提取的html文本
* @param tagType 标签的类型
* @param attributeName 某个属性的名称
* @param attributeValue 属性应取的值
* @return
*/
public static <T extends TagNode> List<T> parseTags(String html,final Class<T> tagType,final String attributeName,final String attributeValue){
try {
//创建一个html解释器
Parser parser=new Parser();
parser.setInputHTML(html);
NodeList tagList = parser.parse(
new NodeFilter(){
@Override
public boolean accept(Node node) {
if(node.getClass()==tagType){
T tn=(T) node;
String attrValue=tn.getAttribute(attributeName);
if(attrValue!=null && attrValue.equals(attributeValue)){
return true;
}
}
return false;
}
}
);
List<T> tags=new ArrayList<T>();
for(int i=0; i<tagList.size();i++){
T t=(T) tagList.elementAt(i);
tags.add(t);
}
return tags;
} catch (ParserException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
/**
* 提取具有某个属性值的标签
* @param html 被提取的html文本
* @param tagType 标签的类型
* @param attributeName 某个属性的名称
* @param attributeValue 属性应取的值
* @return
*/
public static <T extends TagNode> T parseTag(String html,final Class<T> tagType,final String attributeName,final String attributeValue){
List<T> tags=parseTags(html, tagType, attributeName, attributeValue);
if(tags!=null&&tags.size()>0){
return tags.get(0);
}
return null;
}
/**
* 提取具有某个属性值的标签
* @param html 被提取的html文本
* @param tagType 标签的类型
* @return
*/
public static <T extends TagNode> T parseTag(String html,final Class<T> tagType){
return parseTag(html, tagType,null,null);
}
/**
* 提取具有某个属性值的标签列表
* @param html 被提取的html文本
* @param tagType 标签的类型
* @return
*/
public static <T extends TagNode> List<T> parseTags(String html,final Class<T> tagType){
return parseTags(html, tagType,null,null);
}
}
HttpUtils类
public class HttpUtils {
public static String getHtml(HttpClient httpClient,String Url){
try {
// 利用HTTP GET向服务器发起请求
HttpGet get = new HttpGet(Url);
// 获得服务器响应的的所有信息
HttpResponse response = httpClient.execute(get);
// 获得服务器响应回来的消息体(不包括HTTP HEAD)
HttpEntity entity = response.getEntity();
if (entity != null) {
// 获得响应的字符集编码信息
// 即获取HTTP HEAD的:Content-Type:text/html;charset=UTF-8中的字符集信息
String charset = EntityUtils.getContentCharSet(entity);
InputStream is = entity.getContent();
return IOUtils.toString(is, charset);
}
} catch (ClientProtocolException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
public static byte[] getImage(HttpClient httpClient,String Url){
try {
// 利用HTTP GET向服务器发起请求
HttpGet get = new HttpGet(Url);
// 获得服务器响应的的所有信息
HttpResponse response = httpClient.execute(get);
// 获得服务器响应回来的消息体(不包括HTTP HEAD)
HttpEntity entity = response.getEntity();
if (entity != null) {
// 获得响应的字符集编码信息
// 即获取HTTP HEAD的:Content-Type:text/html;charset=UTF-8中的字符集信息
String charset = EntityUtils.getContentCharSet(entity);
InputStream is = entity.getContent();
return IOUtils.toByteArray(is);
}
} catch (ClientProtocolException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
}
分享到:
相关推荐
本篇将重点讲解如何利用HTMLParser库在Java中抓取网页数据。 HTMLParser是Java的一个开源库,专门用于解析HTML文档,提取其中的数据。它的设计目标是简化HTML解析过程,即使面对不规范的HTML代码也能有效地处理。...
本项目以"htmlparser抓取网页内容"为主题,具体实践了如何利用HTMLParser库来从国家专利局的网站上抓取专利状态信息。 首先,我们要理解HTMLParser的工作原理。HTMLParser是Python的内置库,它提供了一个基础的事件...
本文将详细介绍如何利用HtmlParser这一开源工具来提取网页中的关键信息,并通过数据清洗将其存储到SQL数据库中,以便后续的数据分析和应用。 #### 二、HtmlParser概述 HtmlParser是一种轻量级、高效且易于使用的...
### HTMLParser提取网页超链接研究 #### 一、引言 随着互联网技术的快速发展和普及,全球信息资源呈爆炸式增长。在这个过程中,各种互联网搜索引擎(例如百度、谷歌等)应运而生,它们极大地便利了人们获取所需...
"htmlparser实现从网页上抓取数据.doc"文件则很可能是一个详细的教程,指导用户如何利用HTMLParser库进行网页数据抓取。在这个教程中,可能会涵盖以下关键知识点: 1. **安装和引入HTMLParser**:首先,用户需要将...
使用HTMLParser,我们可以解析网页内容,提取所需信息,如文章标题、链接、图片等。以下是一些核心概念和步骤: 1. **创建自定义解析器**: 首先,我们需要继承Python的`HTMLParser`类,并重写其方法,如`handle_...
然而,这段代码仅实现了基础的网页抓取功能,没有利用HTMLParser库的优势。HTMLParser库提供了一系列方法和接口,如`Parser`类和`NodeVisitor`接口,可以更深入地解析HTML文档: - `Parser`: HTMLParser的核心类,...
本文主要介绍了如何利用HttpClient与HTMLParser这两种技术来实现网页正文的提取。文章首先阐述了互联网信息飞速增长的背景下,网页数据提取的重要性,以及自动化的网页抓取与分析对于科研、工程和商业活动的意义。...
### HTMLParser抽取Web网页正文信息的关键知识点 ...通过上述步骤,HTMLParser不仅能够高效地从网页中提取正文信息,还能通过一系列智能算法确保提取的内容与主题高度相关,极大地提高了信息处理的效率和质量。
2. **WebParser**:可能是一个简单的网页抓取器,利用HtmlParser解析网页,提取所需信息,例如新闻标题、链接等。 开发者可以打开`AnalyzeHtml.sln`,编译并运行这两个项目,以了解HtmlParser的具体使用方法和实际...
在这个例子中,我们将深入理解如何利用HTMLParser来抓取指定网站的数据。 首先,HTMLParser库提供了一个解析器类,它能够读取HTML源码,并将其转化为易于处理的结构。通过这个库,我们可以方便地定位和提取页面上的...
电商网站的测试工具可能利用HTMLParser检查商品列表是否正确显示。 然而,需要注意的是,HTMLParser虽强大,但并不能解决所有的HTML解析问题。有些网页可能含有非标准的HTML结构,或者使用JavaScript动态生成内容,...
HtmlParser是一个用于网页抓取和解析的库,它能够帮助开发者高效地提取HTML文档中的信息并将其转换为结构化的XML格式。在Web开发中,这样的工具对于数据挖掘、搜索引擎优化(SEO)、网络爬虫和自动化信息处理至关...
本项目就是利用HTMLParser库来编写一个基础的网页爬虫,用于爬取新浪新闻的数据,并将抓取到的数据存储到Excel表格中。以下是关于这个项目的一些关键知识点和实现细节: 1. **HTMLParser库**:HTMLParser是一个开源...
标签`c# htmlparser`表明这个库是为C#语言设计的,这意味着它可以无缝集成到任何.NET Framework或.NET Core项目中,利用C#的特性如 LINQ 来简化数据提取。 标签`dll`提醒我们这个库是以DLL形式提供的,这意味着它是...
它提供了简单且灵活的方式来处理HTML标记,使得在Java程序中操作和分析HTML内容变得容易...有了这个压缩包中包含的所有jar包,你将能够充分利用HTMLParser的功能,无论你是进行简单的文本提取还是复杂的网页处理任务。
在很多Web抓取、信息提取以及网页分析的项目中,HTMLParser都是一个理想的工具。 HTMLParser库的设计考虑了易用性和灵活性,它提供了丰富的API,允许开发者通过编程方式来访问和操作HTML文档的各个元素,如标签、...
- `sitecapturer.jar` 可能是一个完整的网站捕获工具,利用HTMLParser抓取和保存整个网站的静态副本。 使用HTMLParser可以进行各种应用,如搜索引擎爬虫、社交媒体数据分析、新闻聚合、电商价格监控等。开发者可以...