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

如何使用正则表达式在Java中解析HTML?,java,regex,Java,Regex,有人能告诉我一种在html文件中使用Java正则表达式查找href和src标记的简单方法吗? 然后,如何获取与标记关联的URL 谢谢你的建议。使用正则表达式从HTML中提取值总是一个错误。HTML语法可能比它第一次出现时复杂得多,而且页面很容易捕捉到一个非常复杂的正则表达式 改用一个字母。另请参见我搜索了正则表达式库(和) 我发现最好的是 ((?<html>(href|src)\s*=\s*")|(?<css>url\())(?<url>.*?)(?(html

有人能告诉我一种在html文件中使用Java正则表达式查找href和src标记的简单方法吗?
然后,如何获取与标记关联的URL


谢谢你的建议。

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


改用一个字母。另请参见

我搜索了正则表达式库(和)

我发现最好的是

((?<html>(href|src)\s*=\s*")|(?<css>url\())(?<url>.*?)(?(html)"|\))
((?(href | src)\s*=\s*”)(?url\())(?*?((html);\)
有关更多表达式,请查看以下链接:


如果您想进行html解析,Dave和我建议您使用以下代码解析锚定标记的字符串数据并打印它们的href

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

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());
File parserLibraryFile=新文件(“lib/MozillaHtmlParser/native/bin/MozillaParser”+EnvironmentController.getSharedLibraryExtension());
字符串parserLibrary=parserLibraryFile.getAbsolutePath();
//mozilla.dist.bin目录:
最终文件mozillaDistBinDirectory=新文件(“lib/MozillaHtmlParser/mozilla.dist.bin.+EnvironmentController.getOperatingSystemName());
init(parserLibrary,mozillaDistBinDirectory.getAbsolutePath());
MozillaParser=新的MozillaParser();
Document domDocument=parser.parse(数据);
NodeList list=domDocument.getElementsByTagName(“a”);
对于(int i=0;i
不要使用正则表达式使用NekoHTML或TagSoup,它们是访问HTML文档时提供SAX或DOM方法的桥梁。

其他答案是正确的。Java Regex 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));
}
String html=“foo baz foo”;
Pattern p=Pattern.compile(“”);
Matcher m=p.Matcher(html);
while(m.find()){
系统输出println(m.group(0));
系统输出println(m.group(1));
}
输出为:

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

链接1
链接2

请注意,必须使用惰性/不情愿限定符*?才能将分组减少到单个标记。组0是整个匹配项,组1是下一个组匹配项(下一对括号).

正则表达式只能解析正则语言,这就是为什么它们被称为正则表达式。HTML不是正则语言,因此它不能被正则表达式解析

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


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

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

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

试着这样做:

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

这取决于您正在做什么。如果您正在处理来自随机源的大量HTML,HTML解析器很可能会在其中一些源上失败,并且可能需要比正则表达式更多的内存和处理。例如,Heritrix web crawler使用正则表达式在HTML页面上提取链接。请先回答原始问题,然后建议h如何优化。许多人访问这个问题,希望了解如何使用正则表达式解析HTML,但却发现了他们不需要的东西。使用正则表达式既快又脏,而且不需要下载单独的库就可以工作。我不同意这个答案,使用正则表达式绝不总是错误的html上的正则表达式-正如@Kris所指出的:试图解析完整的html文档通常需要有效的html,但并不总是提供有效的html。如果你有一个明确定义的例子,比如找到标签的href属性值,那么它会带来巨大的杀伤力。我讨厌那个网站。我看到他们仍然懒得提及给定正则表达式的目标是哪种风格at.This regex(id=2261)使用命名捕获和条件,Java不支持这两种。谢谢。虽然不是真正的“无处不在”regex,但它适用于从google hot trends返回的数据,我花了很长时间才解析它……规范问题: