代码之家  ›  专栏  ›  技术社区  ›  Ricardo Felgueiras

如何使用正则表达式在Java中解析HTML?

  •  14
  • Ricardo Felgueiras  · 技术社区  · 16 年前

    有人能告诉我一种在html文件中使用Java正则表达式查找href和src标记的简单方法吗?

    谢谢你的建议。

    7 回复  |  直到 16 年前
        1
  •  55
  •   Community CDub    7 年前

    使用正则表达式从HTML中提取值总是一个错误。HTML语法可能比它第一次出现时复杂得多,而且页面很容易捕捉到一个非常复杂的正则表达式。

    HTML Parser 相反另见 What are the pros and cons of the leading Java HTML parsers?

        2
  •  21
  •   Henryk Konsek    16 年前

    其他答案都是正确的。Java正则表达式API不是实现目标的合适工具。使用其他答案中提到的高效、安全和经过良好测试的高级工具。

    如果您的问题涉及的是Regex API,而不是实际问题(例如学习目的),则可以使用以下代码:

    String html = "foo <a href='link1'>bar</a> baz <a href='link2'>qux</a> foo";
    Pattern p = Pattern.compile("<a href='(.*?)'>");
    Matcher m = p.matcher(html);
    while(m.find()) {
       System.out.println(m.group(0));
       System.out.println(m.group(1));
    }
    

    <a href='link1'>
    link1
    <a href='link2'>
    link2
    

    请注意,懒惰/勉强限定符*?必须使用,以便将分组减少为单个标记。组0是整个匹配项,组1是下一个组匹配项(下一对括号)。

        3
  •  7
  •   mP.    16 年前

    不要使用正则表达式使用NekoHTML或TagSoup,它们是一个桥梁,提供了访问HTML文档的SAX或DOM方法。

        4
  •  5
  •   Scott Cowan    16 年前

    因为您只使用锚定标记,所以只使用正则表达式应该是可以的,但是如果您想做更多的事情,可以使用解析器。这个 Mozilla HTML Parser

    File parserLibraryFile = new File("lib/MozillaHtmlParser/native/bin/MozillaParser" + EnviromentController.getSharedLibraryExtension());
                    String parserLibrary = parserLibraryFile.getAbsolutePath();
                    //  mozilla.dist.bin directory :
                    final File mozillaDistBinDirectory = new File("lib/MozillaHtmlParser/mozilla.dist.bin."+ EnviromentController.getOperatingSystemName());
    
            MozillaParser.init(parserLibrary,mozillaDistBinDirectory.getAbsolutePath());
    MozillaParser parser = new MozillaParser();
    Document domDocument = parser.parse(data);
    NodeList list = domDocument.getElementsByTagName("a");
    
    for (int i = 0; i < list.getLength(); i++) {
        Node n = list.item(i);
        NamedNodeMap m = n.getAttributes();
        if (m != null) {
            Node attrNode = m.getNamedItem("href");
            if (attrNode != null)
               System.out.println(attrNode.getNodeValue());
    
        5
  •  3
  •   Mark    16 年前
        6
  •  2
  •   Jörg W Mittag    16 年前

    正则表达式只能解析正则语言,这就是它们被调用的原因 有规律的 表达。HTML不是一种正则语言,因此它不能被正则表达式解析。

    另一方面,HTML解析器, 可以 解析HTML,这就是为什么它们被称为HTML解析器。

    您应该使用您最喜欢的HTML解析器。

        7
  •  1
  •   Guss    16 年前

    与流行观点相反,正则表达式是从非结构化文本(即HTML)中提取数据的有用工具。

    如果您正在进行复杂的HTML数据提取(例如,查找页面中的所有段落),那么HTML解析可能是一种方法。但是,如果您只需要从HREF获取一些URL,那么正则表达式就可以很好地工作,并且很难破坏它。

    试着这样做:

    /<a[^>]+href=["']?([^'"> ]+)["']?[^>]*>/i