我最近遇到了社区挑战,并且尝试在以下行中提取“rel”标签的值:
<td><a title='Visit Personal Stats Page for ijackk' href='personal.php?name=ijackk&amp;clan=ph_chat_ftw' class='rsn' rel='ijackk' style='color: #FFFFFF;'>ijackk</a></td>
原因是挑战,因此我需要从成员列表(具有与他们的帐户相关的属性的人的列表)中提取多个用​​户的名称。我没有使用正则表达式,但是我觉得那是最好的。我看过经典的文章,为什么正则表达式不好,但是我也看到过一些文章说,将正则表达式用于类似的东西并不是一件坏事。

以下是我到目前为止所做的事情:

public class Parser {

public static void main(String[] arguments) {
    new Parser().parse();
}

public void parse() {
    try {
        URL url = new URL("http://www.runehead.com/clans/ml.php?clan=ph_chat_ftw");
        BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(url.openStream()));
        String line;
        StringBuilder stringBuilder = new StringBuilder();
        while ((line = bufferedReader.readLine()) != null) {
            if (line.contains("Visit")) {
                stringBuilder.append(line).append("\n");
                System.out.println(line);
            }
        }
        Matcher matcher = Pattern.compile("\\?rel='([A-Za-z0-9_]*)'").matcher(stringBuilder.toString());
        while (matcher.find()) {
            System.out.println("matched: " + matcher.group(1));
        }
    } catch (MalformedURLException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
}

}

除了上面的每个名称之外,我上面提供的内容都是我所提供的。匹配器什么也没找到。我可以帮忙吗?

最佳答案

您假设rel属性紧随?之后,但不一定是这种情况。您可以使用以下内容:

Pattern.compile("rel=\"([A-Za-z0-9_]*)\"")

当然可以,但是正如其他人所说,最好使用适当的HTML解析器。这是jsoup的示例:
Document doc = Jsoup.connect(
    "http://www.runehead.com/clans/ml.php?clan=ph_chat_ftw").get();
Elements users = doc.select("a[rel]");
for (Element user : users) {
    System.out.println(user.attr("rel"));
}

与您的正则表达式方法相比,这更干净(并且更安全(并且更灵活(和可维护)))。

08-04 03:24