我最近遇到了社区挑战,并且尝试在以下行中提取“rel”标签的值:<td><a title='Visit Personal Stats Page for ijackk' href='personal.php?name=ijackk&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"));
}
与您的正则表达式方法相比,这更干净(并且更安全(并且更灵活(和可维护)))。