[英]How to use regular expressions to parse HTML in Java?
有人可以告诉我一个简单的方法在Java中使用正则表达式在html文件中找到href和src标签吗?
然后,如何获取与标记关联的URL?
谢谢你的任何建议。
使用正则表达式从HTML中提取值总是一个错误。 它可能首先出现的HTML语法要复杂得多,而且即使是非常复杂的正则表达式,页面也很容易识别出来。
请改用HTML Parser 。 另请参阅主要Java HTML解析器的优缺点是什么?
其他答案都是真的。 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));
}
输出是:
<a href='link1'>
link1
<a href='link2'>
link2
请注意懒惰/不情愿的资格赛*? 必须使用以减少分组到单个标记。 组0是整个匹配,组1是下一组匹配(下一对括号)。
不要使用正则表达式使用NekoHTML或TagSoup,这是一个提供SAX或DOM的桥梁,就像在XML方法中访问HTML文档一样。
如果你想沿着html解析路线走下去,Dave和我推荐这里的代码来解析锚点标签的字符串数据并打印它们的href。
因为你只是使用锚标签,你应该只使用正则表达式,但如果你想做更多,请使用解析器。 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());
我搜索了正则表达式库( http://regexlib.com/Search.aspx?k=href和http://regexlib.com/Search.aspx?k=src )
我找到的最好的是
((?<html>(href|src)\s*=\s*")|(?<css>url\())(?<url>.*?)(?(html)"|\))
查看这些链接以获取更多表达式:
http://regexlib.com/REDetails.aspx?regexp_id=2261
http://regexlib.com/REDetails.aspx?regexp_id=758
与流行的观点相反,正则表达式是从非结构化文本(HTML是)中提取数据的有用工具。
如果您正在进行复杂的HTML数据提取(例如,查找页面中的所有段落),则可能需要进行HTML解析。 但是,如果您只需要从HREF获取一些URL,那么正则表达式将正常工作并且很难打破它。
尝试这样的事情:
/<a[^>]+href=["']?([^'"> ]+)["']?[^>]*>/i
正则表达式只能解析常规语言,这就是它们被称为正则表达式的原因。 HTML不是常规语言,因此无法通过正则表达式进行解析。
另一方面,HTML解析器可以解析HTML,这就是为什么它们被称为HTML解析器。
您应该使用您最喜欢的HTML解析器。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.