Java 使用正则表达式从HTML标记抓取文本
我试图从HTML标记中读取一些内容,但对于正则表达式,我完全是个傻瓜(我已经想到了一些模式,但似乎没有一种模式起作用) 我在看一个网页,看这行:Java 使用正则表达式从HTML标记抓取文本,java,regex,Java,Regex,我试图从HTML标记中读取一些内容,但对于正则表达式,我完全是个傻瓜(我已经想到了一些模式,但似乎没有一种模式起作用) 我在看一个网页,看这行: 我需要从那里提取“demilit”,你可以看到,有3个这样做的机会 哪一个位置是提取它的最佳位置?我将如何实现 我也用它来查找名称,因为我需要提取大约60个不同的名称,它们都使用相同的格式,只是名称只能包含字母、数字和下划线 public void parse(String list) { try { URL url = new
我需要从那里提取“demilit”,你可以看到,有3个这样做的机会
哪一个位置是提取它的最佳位置?我将如何实现
我也用它来查找名称,因为我需要提取大约60个不同的名称,它们都使用相同的格式,只是名称只能包含字母、数字和下划线
public void parse(String list) {
try {
URL url = new URL(list);
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(url.openStream()));
String line;
StringBuilder stringBuilder = new StringBuilder();
while ((line = bufferedReader.readLine()) != null) {
stringBuilder.append(line).append("\n");
}
System.out.println(stringBuilder.toString());
Matcher matcher = namePattern.matcher(stringBuilder.toString());
if (matcher.find()) {
System.out.println("matched: " + matcher.group());
}
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
(\w+
将抓取
和
之间的文本并将其放入第一组;但正如其他人所说,regex可能不是这里的最佳选择
编辑:将第一个+更改为*因为0个字符有效。还删除了第二个?根据下面的评论。这里有一种方法,可以获取rel='XXX'属性中的文本
String val = "<td title='Visit Page for Demilict'><a href='personal.php?name=Demilict&c=s' class='idk' rel='Demilict' style='color: teal;'>Demilict</a></td>";
String newVal = val.replaceFirst("^.*rel='([a-zA-Z0-9_]+)'.*$", "$1");
System.out.println("Result: " + newVal);
String val=”“;
字符串newVal=val.replaceFirst(“^.*rel=”([a-zA-Z0-9!]+)”.$”,“$1”);
System.out.println(“结果:+newVal”);
基本上,它只是寻找rel='XXX',并扔掉除XXX以外的所有东西。它允许rel包含字符a-z和a-z、0-9和下划线。如果确实要使用正则表达式提取名称,此regexp应将名称存储在组1中:
<td[^>]*?><a[^>]*?>(\\w+)</a></td>
]*?>]*?>(\\w+)
为什么不改用DOM?不要使用正则表达式解析HTML-使用解析器(请参阅:)如果没有实际的模式,我们无法真正帮助您。您能告诉我们如何创建namePattern
?此外,考虑使用API进行HTML/XML处理(如果是XTHML,XML将这样做)。使用正则表达式进行此类提取非常容易出错。任何不可预见的情况都可能产生问题。我如何判断它是否是XTHML?我使用namePattern
作为私有模式namePattern=Pattern.compile(“\\?obj=([A-Za-z0-9\]*)”)
正如旁注一样\w regex特殊字符与a-Za-z0-9_相同,非常简单,但可能更简单:您不需要第二个问号,因为左尖括号不是单词字符。非常感谢。还意识到*应该替换第一个+字符,因为0个额外字符也是有效的(尽管在这种情况下不适用)。