请问有没有简单的方法可以使用Java正则表达式在HTML文件中查找href和src标签?
然后,如何获取与标签相关联的URL?
谢谢任何建议。
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
请注意,为了将分组减少到单个标记,必须使用懒惰限定符*?。 Group 0 是整个匹配项,group 1是下一个分组匹配(下一对括号)。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)"|\))
正则表达式只能解析正则语言,这就是为什么它们被称为“正则”表达式。HTML不是一种正则语言,因此无法通过正则表达式进行解析。
另一方面,HTML解析器可以解析HTML,这就是为什么它们被称为HTML解析器的原因。
你应该使用你喜欢的HTML解析器。
与广为流传的观点相反,正则表达式是从非结构化文本(如HTML)中提取数据的有用工具。
如果您正在进行复杂的HTML数据提取(例如,在页面中查找所有段落),那么HTML解析可能是最好的选择。但如果您只需要从HREFs获取一些URL,则正则表达式就足够了,并且很难出错。
尝试使用类似下面的表达式:
/<a[^>]+href=["']?([^'"> ]+)["']?[^>]*>/i