我不想下载任何其他库,我正在谈论这个:javax.swing.text.html.HTMLEditorKit.Parser
如何使用此解析器在页面中提取重复信息?
比如说我在页面中重复了这段代码:
<tr>
<td class="info1">get this info</td>
<td class="info2">get this info</td>
<td class="info3">get this info</td>
</tr>
我可以提供任何示例代码吗?
提前致谢。
答案 0 :(得分:4)
它是一个流解析器,因此它解析它会告诉你它的命中率。您应该将HTMLEditorKit.ParserCallback
扩展为某个类(我将其称为Parser
),然后覆盖您关注的方法。
我相信它只适用于“摇摆中的html dtd”(见here)。如果您正在做更复杂的事情,建议您使用外部Java HTML解析库,例如我之前链接过的the ones之一。
以下是基本代码(demo):
import javax.swing.text.html.parser.*;
import javax.swing.text.html.*;
import javax.swing.text.*;
import java.io.*;
class Parser extends HTMLEditorKit.ParserCallback
{
private boolean inTD = false;
public void handleStartTag(HTML.Tag t, MutableAttributeSet a, int pos)
{
if(t.equals(HTML.Tag.TD))
{
inTD = true;
}
}
public void handleEndTag(HTML.Tag t, int pos)
{
if(t.equals(HTML.Tag.TD))
{
inTD = false;
}
}
public void handleText(char[] data, int pos)
{
if(inTD)
{
doSomethingWith(data);
}
}
public void doSomethingWith(char[] data)
{
System.out.println(data);
}
}
class HtmlTester
{
public static void main (String[] args) throws java.lang.Exception
{
ParserDelegator pd = new ParserDelegator();
pd.parse(new BufferedReader(new InputStreamReader(System.in)), new Parser(), false);
}
}
答案 1 :(得分:3)
Matthew Flaschen回答你的直接问题。我只想补充一些建议:
如果您对正在解析的HTML源有控制(在某种程度上),则应考虑更改该源以更好的形式发出信息。例如,如果它是Web服务器,请让它尊重Accept标头,并在请求时提供(比如)XML或JSON格式的信息。
如果您无法控制HTML的来源,那么您将受到控制它的任何人的摆布。如果他们更改HTML结构,您的解析可能会中断。无论您使用正确的HTML解析器还是(blech)正则表达式,这都适用。
最好的办法就是使用许可的 HTML解析器(例如JSoup)来理解不同版本的HTML规范,并且或多或少地容忍违反眼镜。 (使用严格的解析器的问题是,诸如缺少</li>
之类的小错误将使页面不可解析...对于您的解析器...即使页面在大多数Web浏览器中显示得很好。)< / p>
限制自己仅使用标准Java类库是一个坏主意。标准库通常不能提供最佳解决方案。