用htmlparser工具,parser.extractAllNodesThatMatch(filter)和parser.parse(filter)有什么区别
Parser p= new Parser(url);//url表示你添加的文件路径,或者网页,网页可以,文件我就不知道了。
p.setEncoding("gb2312");//设定格式,以免出现中文乱码;
求翻译We extract all 5*5 patches centered within the mask
我们提取所有的5×5 patchescentered 面具,从500图像造成约220kpatches。我们使每个补丁的removingits直流除以其标准偏差(localcontrast)。
如何使用htmlparser提取网页文本信息
// 提取网页主要文本内容
public String getContent(){
content=(isHub())?getHubEntries():getTopicBlock();
System.out.println("<Content>:");
System.out.println("=========================");
System.out.println(content);
return content;
}
// 提取Hub类网页文本内容,如yahoo,sina等门户网
public String getHubEntries(){
StringBean bean=new StringBean();
bean.setLinks(false);
bean.setReplaceNonBreakingSpaces(true);
bean.setCollapse(true);
try {
parser.visitAllNodesWith(bean);
} catch (ParserException e) {
System.err.println("getHubEntries()-->"+e);
}
parser.reset();
return bean.getStrings();
}
// 获取主题性(Topical)网页文本内容:对于博客等以文字为主体的网页效果较好
public String getTopicBlock(){
HasParentFilter acceptedFilter=new HasParentFilter(new TagNameFilter("p"));
NodeList nodes=null;
try {
nodes=parser.extractAllNodesThatMatch(acceptedFilter);
} catch (ParserException e) {
System.err.println("getTopicBlock"+e);
}
StringBuffer sb=new StringBuffer();
SimpleNodeIterator iter=nodes.elements();
while(iter.hasMoreNodes()){
Node node=iter.nextNode();
sb.append(node.getText()+"\n");
}
parser.reset();
return sb.toString();
}
如何用HTMLPARSER解析JS中的URL
Parser parser = new 一个
PrototypicalNodeFactory p = new PrototypicalNodeFactory();
p.registerTag(new ScriptTag());
parser.setNodeFactory(p);
NodeFilter filterJS = new NodeClassFilter(ScriptTag.class);
NodeList nodelistJS=null;
try {
nodelistJS = parser.extractAllNodesThatMatch(filterJS);
} catch (ParserException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
System.out.println(nodelistJS.toHtml());
如何使用htmlparser获得指定标签里的内容
Parser parser = new Parser(currentURL);
AndFilter filter =
new AndFilter(
new TagNameFilter("div"),
new HasAttributeFilter("id","userName")
);
NodeList nodes = parser.parse(filter);
用htmlparser解析,怎么拿不到子标签的理想对象
最近写一个小爬虫, 用的htmlparser来解析HTML,在解析Object标签时准确地拿到子标签对应的理想对象。
下面这样的一段HTML,
<object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000"
codebase="htt p:/ /download.macromedia.co m/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"
height="406" width="980">
<param name="quality" value="high" />
<param name="movie" value="/flash/index.swf" />
<param name="quality" value="high" />
<param name="wmode" value="transparent" />
<param name="movie" value="/flash/index.swf" />
<embed height="406" pluginspage="htt p:/ /w ww.macrome dia.co m/go/getflashplayer"
quality="high" src="/flashRepository/d973f054-ae5d-453d-bbfb-9b9c825fd7df"
type="application/x-shockwave-flash" width="980" wmode="transparent"></embed>
</object>
我用HtmlParser解析后, 可以成功地拿到Object标签对应的对象, 可再往下就拿不到了, Param和Embed标签都是TagNode类型的, 而不是我想要的ParamTag和EmbedTag,这两个类的实现在下面, 是我自己定义的。
解析的代码是这样的:
PrototypicalNodeFactory factory = new PrototypicalNodeFactory();
factory.registerTag(new LocalObjectTag());
factory.registerTag(new EmbedTag());
factory.registerTag(new ParamTag());
Parser parser = new Parser();
parser.setNodeFactory(factory);
try {
parser.setInputHTML(testHTML);
} catch (ParserException e) {
e.printStackTrace();
}
parser.setFeedback(new DefaultParserFeedback(DefaultParserFeedback.QUIET));
NodeFilter[] srcFilters = { new NodeClassFilter(EmbedTag.class),
new NodeClassFilter(LocalObjectTag.class),new NodeClassFilter(ParamTag.class) };
OrFilter linkFilter = new OrFilter(srcFilters);
// 得到所有经过过滤的标签
try {
NodeList list = parser.extractAllNodesThatMatch(linkFilter);
for (int i = 0; i < list.size(); i++) {
Node n = list.elementAt(i);
if (n instanceof ParamTag) {
ParamTag p = (ParamTag) n;
System.out.println("src: " + p.getSrc());
}
}
} catch (ParserException e) {
e.printStackTrace();
}
System.out.println("exit");
由于Parser里没有自带的EmbedTag和ParamTag, 我自写了这两个类。
Java代码 收藏代码
public class ParamTag extends CompositeTag {
public String getSrc() {
String result = null;
//先看data属性里有没有值。
String srcValue = getAttribute("SRC");
if (StringUtils.isNotBlank(srcValue)) {
return getPage ().getAbsoluteURL (srcValue);
}
return result;
}
public boolean isMovie() {
return null != getAttribute("MOVIE");
}
}
public class EmbedTag extends CompositeTag {
public String getSrc() {
String result = null;
//先看data属性里有没有值。
String srcValue = getAttribute("SRC");
if (StringUtils.isNotBlank(srcValue)) {
return getPage ().getAbsoluteURL (srcValue);
}
return result;
}
}
另, 为了方便地使用ObjectTag, 我又继承了下, 搞了个新类LocalObjectTag。
Java代码 收藏代码
public class LocalObjectTag extends ObjectTag {
public String extractUrl() {
String result = null;
//先看data属性里有没有值。
String dataValue = getAttribute("data");
if (StringUtils.isNotBlank(dataValue)) {
return getPage ().getAbsoluteURL (dataValue);
}
result = fromChildren();
if (StringUtils.isNotBlank(result)) {
return result;
}
return result;
}
private String fromChildren() {
String result = null;
NodeList nList = this.getChildren();
for(int i=0;i<nList.size();i++) {
Node n = nList.elementAt(i);
if (n instanceof TagNode) {
TagNode tNode = (TagNode)n;
String value = tNode.getAttribute("VALUE");
String nameAttri = tNode.getAttribute("name");
if (StringUtils.isNotBlank(value) && "movie".equalsIgnoreCase(nameAttri)) {
return value;
}
String src = tNode.getAttribute("src");
String name = tNode.getTagName();
if (StringUtils.isNotBlank(src) && "embed".equalsIgnoreCase(name)) {
return src;
}
}
}
return result;
}
}
HTMLParser 怎么获取替换后的文本
给你一个OSChina中的代码:
public static String wap_filter(String content) {
if(StringUtils.isBlank(content)) return content;
try{
StringBuilder filterContent = new StringBuilder();
Parser parser = new Parser();
parser.setEncoding("8859_1");
parser.setInputHTML(content);
//遍历所有的节点
NodeList nodes = parser.extractAllNodesThatMatch(new NodeFilter(){
public boolean accept(Node node) {
return true;
}});
for(int i=0;i<nodes.size();i++){
Node node = nodes.elementAt(i);
if(node instanceof LinkTag){
LinkTag lnk = (LinkTag)node;
if(!lnk.isEndTag() && !lnk.isJavascriptLink()){
String href = lnk.getLink();
filterContent.append("<a href='");
if(href.indexOf("w ww.o schina.n et")>0)
href = StringUtils.replace(href, "ww w.oschina.n et", wa p.oschina.n et");
else if(href.startsWith("http://"))
href = "/home/goweb?url="+LinkTool.encode_url(href);
filterContent.append(href);
filterContent.append("'>");
}else{
filterContent.append(lnk.toHtml());
}
}else if(node instanceof TextNode){
TextNode text = (TextNode)node;
filterContent.append(text.getText());
}else{
filterContent.append('<');
filterContent.append(node.getText());
filterContent.append('>');
}
}
return filterContent.toString();
}catch(ParserException e){
e.printStackTrace();
}
return content;
}
自己分析一下吧。
求个完整的能直接运行的用java编程实现提取网页正文并输出成纯文本的程序代码.
参考下面代码
package com.test;
import org.htmlparser.Node;
import org.htmlparser.NodeFilter;
import org.htmlparser.Parser;
import org.htmlparser.filters.TagNameFilter;
import org.htmlparser.tags.TableTag;
import org.htmlparser.util.NodeList;
/**
* 标题:利用htmlparser提取网页纯文本的例子
*/
public class TestHTMLParser {
public static void testHtml() {
try {
String sCurrentLine;
String sTotalString;
sCurrentLine = "";
sTotalString = "";
java.io.InputStream l_urlStream;
java.net.URL l_url = new java.net.URL();
java.net.HttpURLConnection l_connection = (java.net.HttpURLConnection) l_url.openConnection();
l_connection.connect();
l_urlStream = l_connection.getInputStream();
java.io.BufferedReader l_reader = new java.io.BufferedReader(new java.io.InputStreamReader(l_urlStream));
while ((sCurrentLine = l_reader.readLine()) != null) {
sTotalString += sCurrentLine+"/r/n";
// System.out.println(sTotalString);
}
String testText = extractText(sTotalString);
System.out.println( testText );
} catch (Exception e) {
e.printStackTrace();
}
}
public static String extractText(String inputHtml) throws Exception {
StringBuffer text = new StringBuffer();
Parser parser = Parser.createParser(new String(inputHtml.getBytes(),"GBK"), "GBK");
// 遍历所有的节点
NodeList 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);
//System.out.println(nodet.getText());
text.append(new String(nodet.toPlainTextString().getBytes("GBK"))+"/r/n");
}
return text.toString();
}
public static void test5(String resource) throws Exception {
Parser myParser = new Parser(resource);
myParser.setEncoding("GBK");
String filterStr = "table";
NodeFilter filter = new TagNameFilter(filterStr);
NodeList nodeList = myParser.extractAllNodesThatMatch(filter);
TableTag tabletag = (TableTag) nodeList.elementAt(11);
}
public static void main(String[] args) throws Exception {
testHtml();
}
}