使用正则表达式从HTML标记中抓取文本

时间:2011-08-23 11:28:02

标签: java regex

我正在尝试从HTML标签中读取内容,而且当涉及到正则表达式时我完全是愚蠢的(我虽然有一些模式,但似乎没有工作)。

我正在阅读一个网页,看看这一行:<td title='Visit Page for Demilict'><a href='personal.php?name=Demilict&amp;c=s' class='idk' rel='Demilict' style='color: teal;'>Demilict</a></td>

我需要从那里提取'Demilict',你可以看到有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();
    }
}

3 个答案:

答案 0 :(得分:1)

<a.*?>(\w+)</a>会抓取<a ...>< /a>之间的文字并将其放入第一组;但正如其他人所说,正则表达式可能不是最好的选择。

编辑:首先更改+到*,因为0个字符有效。还删除了第二个?根据以下评论。

答案 1 :(得分:1)

如果您确实使用正则表达式来提取名称,则此正则表达式应将名称存储在组1中:

<td[^>]*?><a[^>]*?>(\\w+)</a></td>

答案 2 :(得分:0)

这是一种方法,用于获取rel ='XXX'属性中的文本。

String val = "<td title='Visit Page for Demilict'><a href='personal.php?name=Demilict&amp;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);

基本上它只是寻找rel ='XXX',然后扔掉除了XXX以外的所有东西。它允许rel包含字符a-z和A-Z,0-9和下划线。