使用正则表达式和Java解析HTML的问题

4

我有一个关于使用Java和正则表达式查找html标签的问题。

我正在使用下面的代码来查找HTML中的所有标签,documentURL显然是HTML内容。

find方法返回true,意味着它可以在HTML中找到一些内容,但matches()方法始终返回false,我完全困惑了。

我也参考了Java文档,但找不到答案。

如何正确使用Matcher?

    Pattern keyLineContents = Pattern.compile("(<.*?>)");

    Matcher keyLineMatcher = keyLineContents.matcher(documentURL);

    boolean result = keyLineMatcher.find();

    boolean matchFound = keyLineMatcher.matches();

做这样的事情会引发异常:

     String abc = keyLineMatcher.group(0);

感谢您的选择。

4
不是你想要的答案,但请避免使用正则表达式解析HTML。正确的方法是使用HTML解析器。http://java-source.net/open-source/html-parsers - Yacoby
3个回答

7

循环匹配的正确方法是:

Pattern p = Pattern.compile("<.*?>");
Matcher m = p.matcher(htmlString);
while (m.find()) {
  System.out.println(m.group());
}

说到正则表达式,它们是解析HTML的一种极其低效的方法。原因在于:正则表达式适用于解析正则语言,而HTML是上下文无关语言。当涉及到嵌套标签、在属性值中使用>等情况时,正则表达式就不太好用了。建议使用专门的HTML解析器,例如HTML Parser

5
我会在以后使用HTML解析器。这就是他们都说的... :-) - Stephen C

2

为什么不尝试查看一些开源HTML解析器的源代码?例如HtmlCleaner、Tagsoup等。

一般的策略似乎是尝试解析和清理HTML,并返回一个XML树。

个人认为,我会通过将打开标签添加到LIFO队列中,并在遇到关闭标签时从队列开头删除(匹配)打开标签 - 执行队列移位以允许标签不匹配。


这个答案是回应 @Raha 的问题,关于编写自己的 HTML 解析器吗? - Alan Moore

1
我想从我写的HTML标签中获取关键词内容:
Pattern keyLineContents = Pattern.compile("<(.[^<]*)(keywords)(.[^<]*)>");
Matcher keyLineMatcher = keyLineContents.matcher(documentURL);
boolean result = keyLineMatcher.find();
while(result)
{
  String metaTagContent = keyLineMatcher.group(1) + " " + keyLineMatcher.group(3);
  Pattern kcontent = Pattern.compile("(.*?content=\")(.[^<]*?)(\".[^<]*?)");
  Matcher keyLineMatcher2 = kcontent.matcher(metaTagContent);
  boolean result2 = keyLineMatcher.find();
  while (result2)
  {
    String metaTagContent2 = keyLineMatcher.group(1);
    result2 = keyLineMatcher.find();
  }
}

但我不明白为什么我的result2是false。结果一很好,给出了关键字标签的所有内容。

谢谢


请尝试使用以下正则表达式:"<([^<]*)(keywords)([^<]*)>"".*?content=\"([^<]*?)\"" - Alan Moore

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接