在Java中使用HTMLEditorKit查询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

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.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解析器,这似乎是一个流行的解析器。如果您知道任何其他易于使用的解析器,如果您能介绍它们,我将不胜感激。