如何使用正则expression式来parsingJava中的HTML?

请有人可以告诉我一个简单的方法来find一个HTML文件中使用正则expression式在Java中的href和src标签?
然后,如何获得与标签相关的url?

感谢您的任何build议。

使用正则expression式从HTML中提取值总是一个错误。 HTML语法要复杂得多,它可能首先出现,而且即使是非常复杂的正则expression式,页面也很容易find。

改用HTMLparsing器 。 另请参见领先的Java HTML分析器的优点和缺点是什么?

其他答案是真的。 Java正则expression式API不是实现您的目标的适当工具。 在其他答案中提到高效,安全和经过充分testing的高级工具。

如果你的问题涉及到正则expression式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 

请注意,懒惰/不情愿的限定词*? 必须使用为了减less分组到单个标签。 组0是整个比赛,组1是下一个组匹配(下一对括号)。

不要使用正则expression式使用NekoHTML或TagSoup这是提供SAX或DOM的桥梁,如XML方法访问HTML文档。

如果你想下去的HTMLparsing路线,哪个Dave和我推荐这里的代码parsing一个string数据的锚点标签和打印他们的href。

因为你只是使用锚点标签,你应该只是正则expression式好,但如果你想做更多去parsing器。 Mozilla的HTMLparsing器是最好的。

 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()); 

我search了正则expression式库( http://regexlib.com/Search.aspx?k=href和http://regexlib.com/Search.aspx?k=src

我发现的最好的是

 ((?<html>(href|src)\s*=\s*")|(?<css>url\())(?<url>.*?)(?(html)"|\)) 

查看更多expression式的这些链接:

http://regexlib.com/REDetails.aspx?regexp_id=2261

http://regexlib.com/REDetails.aspx?regexp_id=758

http://regexlib.com/REDetails.aspx?regexp_id=774

http://regexlib.com/REDetails.aspx?regexp_id=1437

正则expression式只能parsing常规语言,这就是为什么他们被称为正则expression式。 HTML不是普通的语言,但是它不能被正则expression式parsing。

另一方面,HTMLparsing器可以parsingHTML,这就是为什么它们被称为HTMLparsing器的原因。

您应该使用您最喜爱的HTMLparsing器。

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

如果您正在进行复杂的HTML数据提取(比如说,查找页面中的所有段落),那么HTMLparsing可能就是要走的路。 但是如果你只需要从HREF获得一些URL,那么正则expression式就可以正常工作,而且很难打破它。

尝试这样的事情:

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