package com.htmlparser;
import java.net.URL;
import java.util.HashSet;
import java.util.Set;
import org.htmlparser.NodeFilter;
import org.htmlparser.beans.LinkBean;
import org.htmlparser.filters.TagNameFilter;
import org.htmlparser.Parser;
import org.htmlparser.beans.StringBean;
import org.htmlparser.filters.AndFilter;
import org.htmlparser.filters.HasAttributeFilter;
import org.htmlparser.tags.Div;
import org.htmlparser.tags.HeadingTag;
import org.htmlparser.tags.Span;
import org.htmlparser.util.NodeList;
import org.htmlparser.util.ParserException;
/*
* Author sanshang
*/
public class ParseNews {
private Parser parser = null; // 用于分析网页的分析器。
private Set<String> links = new HashSet<String>();
/*
* 测试LinkBean的用法
*/
public Set<String> testLinkBean() {
LinkBean linkBean = new LinkBean();
linkBean.setURL("http://finance.sina.com.cn/stock/");
URL[] urls = linkBean.getLinks();
for (int i = 0; i < urls.length; i++) {
URL url = urls[i];
if (accept(url.toString())) {
// System.out.println("url is :" + url);
links.add(url.toString());
}
}
return links;
}
public boolean accept(String url) {
if (url
.matches("http://finance.sina.com.cn/stock/gujiayidong/20090526/[\\d]+.shtml")) {
return true;
} else {
return false;
}
}
/*
* 得到标题
*/
private String getTitle(NodeFilter titleFilter, Parser parser) {
String titleName = "";
try {
NodeList titleNodeList = (NodeList) parser.parse(titleFilter);
for (int i = 0; i < titleNodeList.size(); i++) {
HeadingTag title = (HeadingTag) titleNodeList.elementAt(i);
titleName = title.getStringText();
}
} catch (ParserException ex) {
}
return titleName;
}
/*
* 得到新聞編輯
*/
private String getNewsAuthor(NodeFilter newsauthorFilter, Parser parser) {
String newsAuthor = "";
try {
NodeList authorList = (NodeList) parser.parse(newsauthorFilter);
for (int i = 0; i < authorList.size(); i++) {
Span authorSpan = (Span) authorList.elementAt(i);
newsAuthor = authorSpan.getStringText();
}
} catch (ParserException ex) {
}
return newsAuthor;
}
/*
* 获得新闻的日期
*/
private String getNewsDate(NodeFilter dateFilter, Parser parser) {
String newsDate = null;
try {
NodeList dateList = (NodeList) parser.parse(dateFilter);
for (int i = 0; i < dateList.size(); i++) {
Span dateTag = (Span) dateList.elementAt(i);
newsDate = dateTag.getStringText();
}
} catch (ParserException ex) {
}
return newsDate;
}
/**
* 获取新闻的内容
*/
private String getNewsContent(NodeFilter newsContentFilter, Parser parser) {
String content = null;
StringBuilder builder = new StringBuilder();
try {
NodeList newsContentList = (NodeList) parser
.parse(newsContentFilter);
for (int i = 0; i < newsContentList.size(); i++) {
Div newsContenTag = (Div) newsContentList.elementAt(i);
builder = builder.append(newsContenTag.getStringText());
}
content = builder.toString(); // 转换为String 类型。
if (content != null) {
parser.reset();
parser = Parser.createParser(content, "gb2312");
StringBean sb = new StringBean();
sb.setCollapse(true);
parser.visitAllNodesWith(sb);
content = sb.getStrings();
// content = content.replaceAll("\\\".*[a-z].*\\}", "");
content = content.replace("已有_COUNT_位网友发表评论 我要评论", "");
content = content
.replace(
"新浪声明:此消息系转载自新浪合作媒体,新浪网登载此文出于传递更多信息之目的,并不意味着赞同其观点或证实其描述。文章内容仅供参考,不构成投资建议。投资者据此操作,风险自担。",
"");
content = content.replace("以下是本文可能影响或涉及到的板块个股:", "");
content = content
.replace(
"新浪声明:新浪网登载此文出于传递更多信息之目的,并不意味着赞同其观点或证实其描述。文章内容仅供参考,不构成投资建议。投资者据此操作,风险自担。",
"");
} else {
System.out.println("没有得到新闻内容!");
}
} catch (ParserException ex) {
}
return content;
}
public void parser(String url) {
try {
parser = new Parser(url);
// NodeFilter titleFilter = new TagNameFilter("h1");
// 标题Filter
NodeFilter titleFilter = new AndFilter(new TagNameFilter("h1"),
new HasAttributeFilter("id", "artibodyTitle"));
// 内容Filter
NodeFilter contentFilter = new AndFilter(new TagNameFilter("div"),
new HasAttributeFilter("id", "artibody"));
// 日期Filter
NodeFilter newsdateFilter = new AndFilter(
new TagNameFilter("span"), new HasAttributeFilter("id",
"pub_date"));
// 作者Filter
NodeFilter newsauthorFilter = new AndFilter(new TagNameFilter(
"span"), new HasAttributeFilter("id", "media_name"));
String newsTitle = getTitle(titleFilter, parser);
System.out.println(newsTitle);
parser.reset(); // 记得每次用完parser后,要重置一次parser。要不然就得不到我们想要的内容了。
String newsContent = getNewsContent(contentFilter, parser);
System.out.println(newsContent); // 输出新闻的内容,查看是否符合要求
parser.reset();
String newsDate = getNewsDate(newsdateFilter, parser);
System.out.println(newsDate);
parser.reset();
String newsauthor = getNewsAuthor(newsauthorFilter, parser);
System.out.println(newsauthor);
System.out
.println("------------------------------------------------------------");
} catch (ParserException ex) {
}
}
public static void main(String[] args) {
ParseNews parseNews = new ParseNews();
// parseNews.testLinkBean();
parseNews.links = parseNews.testLinkBean();
for (String o : parseNews.links) {
parseNews.parser(o);
}
}
}
引用
备注:matches方法的第二个参数是正则。当URL中含有“?”时,记得要用正则表达:[?]
分享到:
相关推荐
标题中的“动车组,自动抓取新闻页面”是一个项目或者工具的名称,它借鉴了“火车头”(一种常见的网络爬虫软件)的概念,但声称比“火车头”更简单易用。这个工具的主要功能是自动从互联网上抓取新闻页面的内容,...
在提供的压缩包中,"抓取新闻.jar"文件很可能是一个包含了网络爬虫代码的可执行文件。为了运行这个程序,你需要将它添加到你的系统环境变量中,这样你可以在命令行直接启动它。如果遇到批处理文件的问题,可能是因为...
在IT行业中,"计划任务实时抓取新闻"是一个常见的需求,尤其对于数据分析、信息监控或者新闻聚合类应用来说,这是非常关键的技术环节。下面将详细解释这个过程涉及的知识点。 首先,我们需要理解“计划任务”...
在Android平台上,开发一款能够抓取并展示新闻的...以上就是Android抓取新闻Demo程序的主要技术要点,涵盖了网络通信、数据解析、UI设计、本地存储、权限管理等多个方面,对Android开发者来说是一次全面的实战训练。
在这个“java爬虫抓取新闻.zip”压缩包中,包含了一个名为“爬虫”的可能为源代码的文件以及一个“1.accdb”数据库文件,这可能是用来存储爬取到的新闻数据。 首先,让我们详细了解一下Java爬虫的基本概念。Java...
综上所述,本示例的"C# WinForm 抓取新闻"项目涉及了HTTP请求、HTML解析、WinForm服务创建以及数据存储等多个关键知识点。通过学习和实践,开发者不仅可以掌握新闻抓取的基本流程,还能提升在C#环境下开发桌面应用...
标题中的“给站长们分享个抓取新闻类的脚本”表明了这是一个针对网站管理员或开发者分享的资源,主要是关于如何自动抓取新闻类数据的编程脚本。这类脚本通常用于数据分析、信息聚合或者建立新闻门户等目的。在IT行业...
本示例是关于如何使用Jsoup库异步抓取网络上的新闻数据,并将其填充到ListView中,模仿开源中国的资讯列表。Jsoup是一个强大的Java库,它使得解析HTML文档、提取和修改数据变得简单。 首先,我们需要了解Jsoup的...
包括抓取新闻的正文部分。java源码,jar包也在里面。可以直接运行。 可直接导入dicuz 帖子数据库 这是这个源码的博客介绍地址http://blog.csdn.net/kissliux/article/details/14227057 欢迎学习和拍砖 这个项目...
本文将深入探讨如何使用jsoup这个Java库来实现异步抓取新闻数据,并将其装载到Android的ListView中,模拟开源中国资讯列表的功能。 首先,我们需要了解jsoup。Jsoup是一个用于处理实际世界HTML的Java库。它提供了...
这个源码提供了从网页抓取新闻内容并以纯文本形式输出的功能,这对于数据分析、内容聚合或者建立个人新闻聚合器非常有用。 首先,我们要理解新闻抓取的基本原理。它主要基于HTML解析和网络请求。HTML是构成网页的...
在这个项目中,它被用来从网易新闻网站上抓取新闻内容和相关评论。爬虫通常包括URL管理、网页请求、HTML解析和数据提取等步骤。Python语言中的Scrapy或BeautifulSoup库常被用于构建爬虫,它们能够高效地处理网页抓取...
【美科新闻抓取程序源码】是一款基于Python语言编写的程序,主要用于自动化地从互联网上抓取新闻数据。这款程序对于学习网络爬虫技术、数据挖掘以及信息处理的初学者来说,是一份宝贵的教育资源。它由2017年武汉美...
在这个项目中,ASP 被用来编写脚本来实现自动从网络上抓取新闻数据并存储到ACCESS数据库中。 首先,我们需要理解“自动新闻采集”的概念。这通常涉及到网络爬虫(Web Crawler)的编程,通过模拟浏览器发送HTTP请求...
【Java新闻抓取】是一种利用编程技术从网络上自动收集并处理特定信息的过程,这里主要关注的是使用Java语言来实现对腾讯IT业界滚动新闻的抓取。在IT领域,新闻抓取是数据挖掘的重要组成部分,它能帮助我们获取实时、...
【新闻自动抓取类在ASP.NET中的实现】 在ASP.NET框架中,开发新闻自动抓取类是一项常见的任务,尤其对于构建新闻聚合网站或者数据分析平台至关重要。这类应用的主要目的是从目标网站上获取最新的文章内容,通过解析...
在本课程中,我们将深入探讨如何使用Web抓取技术来获取新闻内容页的各个关键信息,包括标题、时间、来源、正文以及评论数。首先,我们来看一下新闻内容页的一般结构。 对于一个新闻页面,通常包含以下几个部分: 1....
标签“爬虫 抓取新闻 网页新闻例子”进一步确认了这个示例是关于抓取网页新闻的,因此我们可以期待代码示例包括了如何定位和抓取新闻内容的具体细节。 至于压缩包内的“爬虫”文件,可能是包含整个项目源码的文件夹...
本实例主要探讨如何使用Python编写一个简单的爬虫,针对中国稀土网的新闻中心国内新闻板块,抓取首页的新闻标题、发布时间、来源和正文。下面将详细阐述实现这个任务所需的关键知识点。 1. **Python基础**:Python...
HTML结构:上述代码假设新闻标题在标签中,实际应用中需根据目标网站的HTML结构进行调整。 异常处理:示例代码中仅包含了基本的错误检查,实际应用中可能需要更详细的异常处理逻辑。 数据存储:实际应用中,你可能...