在Java中使用HTMLEditorKit查询HTML文件时出现问题
My HTML包含以下形式的标记:在Java中使用HTMLEditorKit查询HTML文件时出现问题,java,html,parsing,Java,Html,Parsing,My HTML包含以下形式的标记: <div class="author"><a href="/user/1" title="View user profile.">Apple</a> - October 22, 2009 - 01:07</div> -2009年10月22日-01:07 我想从每个标签中提取日期,在本例中为“2009年10月22日-01:07” 我已经实现了javax.swing.text.html.HTMLEditorKit
<div class="author"><a href="/user/1" title="View user profile.">Apple</a> - October 22, 2009 - 01:07</div>
-2009年10月22日-01:07
我想从每个标签中提取日期,在本例中为“2009年10月22日-01:07”
我已经实现了javax.swing.text.html.HTMLEditorKit.ParserCallback,如下所示:
class HTMLParseListerInner extends HTMLEditorKit.ParserCallback {
private ArrayList<String> foundDates = new ArrayList<String>();
private boolean isDivLink = false;
public void handleText(char[] data, int pos) {
if(isDivLink)
foundDates.add(new String(data)); // Extracts "Apple" instead of the date.
}
public void handleStartTag(HTML.Tag t, MutableAttributeSet a, int pos) {
String divValue = (String)a.getAttribute(HTML.Attribute.CLASS);
if (t.toString() == "div" && divValue != null && divValue.equals("author"))
isDivLink = true;
}
}
类HtmlParserListerInner扩展了HTMLEditorKit.ParserCallback{
private ArrayList foundDates=new ArrayList();
私有布尔值isDivLink=false;
public void handleText(字符[]数据,整数位置){
if(isDivLink)
add(新字符串(数据));//提取“Apple”而不是日期。
}
public void handleStartTag(HTML.Tag t,MutableAttributeSet a,int pos){
String divValue=(String)a.getAttribute(HTML.Attribute.CLASS);
如果(t.toString()=“div”&&divValue!=null&&divValue.equals(“作者”))
isDivLink=true;
}
}
但是,上面的解析器返回“Apple”,它位于标记内的超链接中。如何修复解析器以提取日期?覆盖
handleEndTag
并检查“a”
但是,这个HTML解析器是90年代早期的,这些方法没有得到很好的指定。重写
handleEndTag
并检查“a”
import java.io.*;
import java.util.*;
import javax.swing.text.*;
import javax.swing.text.html.*;
import javax.swing.text.html.parser.*;
public class ParserCallbackDiv extends HTMLEditorKit.ParserCallback
{
private boolean isDivLink = false;
private String divText;
public void handleEndTag(HTML.Tag tag, int pos)
{
if (tag.equals(HTML.Tag.DIV))
{
System.out.println( divText );
isDivLink = false;
}
}
public void handleStartTag(HTML.Tag tag, MutableAttributeSet a, int pos)
{
if (tag.equals(HTML.Tag.DIV))
{
String divValue = (String)a.getAttribute(HTML.Attribute.CLASS);
if ("author".equals(divValue))
isDivLink = true;
}
}
public void handleText(char[] data, int pos)
{
divText = new String(data);
}
public static void main(String[] args)
throws IOException
{
String file = "<div class=\"author\"><a href=\"/user/1\"" +
"title=\"View user profile.\">Apple</a> - October 22, 2009 - 01:07</div>";
StringReader reader = new StringReader(file);
ParserCallbackDiv parser = new ParserCallbackDiv();
try
{
new ParserDelegator().parse(reader, parser, true);
}
catch (IOException e)
{
System.out.println(e);
}
}
}
然而,这个HTML解析器来自90年代早期,这些方法没有得到很好的指定。import java.io.*;
import java.io.*;
import java.util.*;
import javax.swing.text.*;
import javax.swing.text.html.*;
import javax.swing.text.html.parser.*;
public class ParserCallbackDiv extends HTMLEditorKit.ParserCallback
{
private boolean isDivLink = false;
private String divText;
public void handleEndTag(HTML.Tag tag, int pos)
{
if (tag.equals(HTML.Tag.DIV))
{
System.out.println( divText );
isDivLink = false;
}
}
public void handleStartTag(HTML.Tag tag, MutableAttributeSet a, int pos)
{
if (tag.equals(HTML.Tag.DIV))
{
String divValue = (String)a.getAttribute(HTML.Attribute.CLASS);
if ("author".equals(divValue))
isDivLink = true;
}
}
public void handleText(char[] data, int pos)
{
divText = new String(data);
}
public static void main(String[] args)
throws IOException
{
String file = "<div class=\"author\"><a href=\"/user/1\"" +
"title=\"View user profile.\">Apple</a> - October 22, 2009 - 01:07</div>";
StringReader reader = new StringReader(file);
ParserCallbackDiv parser = new ParserCallbackDiv();
try
{
new ParserDelegator().parse(reader, parser, true);
}
catch (IOException e)
{
System.out.println(e);
}
}
}
导入java.util.*;
导入javax.swing.text.*;
导入javax.swing.text.html.*;
导入javax.swing.text.html.parser.*;
公共类ParserCallbackDiv扩展了HTMLEditorKit.ParserCallback
{
私有布尔值isDivLink=false;
私有字符串文本;
public void handleEndTag(HTML.Tag标记,int-pos)
{
if(tag.equals(HTML.tag.DIV))
{
System.out.println(divText);
isDivLink=false;
}
}
public void handleStartTag(HTML.Tag标记,可变属性集a,int-pos)
{
if(tag.equals(HTML.tag.DIV))
{
String divValue=(String)a.getAttribute(HTML.Attribute.CLASS);
if(“author.”等于(divValue))
isDivLink=true;
}
}
public void handleText(字符[]数据,整数位置)
{
divText=新字符串(数据);
}
公共静态void main(字符串[]args)
抛出IOException
{
字符串文件=“-10月22日,2009-01:07”;
StringReader=新的StringReader(文件);
ParserCallbackDiv parser=新的ParserCallbackDiv();
尝试
{
新的ParserDelegator().parse(读取器,解析器,true);
}
捕获(IOE异常)
{
系统输出打印ln(e);
}
}
}
导入java.io.*;
导入java.util.*;
导入javax.swing.text.*;
导入javax.swing.text.html.*;
导入javax.swing.text.html.parser.*;
公共类ParserCallbackDiv扩展了HTMLEditorKit.ParserCallback
{
私有布尔值isDivLink=false;
私有字符串文本;
public void handleEndTag(HTML.Tag标记,int-pos)
{
if(tag.equals(HTML.tag.DIV))
{
System.out.println(divText);
isDivLink=false;
}
}
public void handleStartTag(HTML.Tag标记,可变属性集a,int-pos)
{
if(tag.equals(HTML.tag.DIV))
{
String divValue=(String)a.getAttribute(HTML.Attribute.CLASS);
if(“author.”等于(divValue))
isDivLink=true;
}
}
public void handleText(字符[]数据,整数位置)
{
divText=新字符串(数据);
}
公共静态void main(字符串[]args)
抛出IOException
{
字符串文件=“-10月22日,2009-01:07”;
StringReader=新的StringReader(文件);
ParserCallbackDiv parser=新的ParserCallbackDiv();
尝试
{
新的ParserDelegator().parse(读取器,解析器,true);
}
捕获(IOE异常)
{
系统输出打印ln(e);
}
}
}
虽然我在考虑这个问题,但在String
s上使用==
通常不是一个好主意。我在Java中搜索html解析器,这似乎是一个流行的解析器。如果你知道任何其他易于使用的解析器,如果你能介绍它们,我将不胜感激。虽然我在考虑,但在String
s上使用==
通常不是一个好主意。我在Java中搜索html解析器,这似乎是一个流行的解析器。如果您知道任何其他易于使用的解析器,如果您能介绍它们,我将不胜感激。