在Java中从HTML标记属性提取值
我最近接受了一项社区挑战,我正在尝试提取以下行中“rel”标记的值:在Java中从HTML标记属性提取值,java,regex,Java,Regex,我最近接受了一项社区挑战,我正在尝试提取以下行中“rel”标记的值: 原因是这个挑战要求我从成员列表(具有与其帐户相关属性的人员列表)中提取多个用户的姓名。我不必使用正则表达式,但我觉得这是最好的。我看过一篇关于为什么正则表达式不好的经典文章,但我也看过一些文章说,将它用于类似的东西并不是一件坏事 以下是我迄今为止所做的工作: public class Parser { public static void main(String[] arguments) { new Parser(
原因是这个挑战要求我从成员列表(具有与其帐户相关属性的人员列表)中提取多个用户的姓名。我不必使用正则表达式,但我觉得这是最好的。我看过一篇关于为什么正则表达式不好的经典文章,但我也看过一些文章说,将它用于类似的东西并不是一件坏事
以下是我迄今为止所做的工作:
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();
}
}
}
除了每个名字之外,我在那里的输出就是我在上面提供的。不过,匹配者什么也没找到。我能得到一些帮助吗?使用合适的HTML解析库。我更喜欢,但还有很多其他的 在大多数情况下,使用正则表达式解析HTML比它的价值要痛苦得多。首先,这不仅很难做到,而且你提出的任何可行的方案都可能非常复杂,根本无法维护
使用jSoup获取
rel
属性:
String html = "<p>An <a href='http://example.com/' rel='someValue'><b>example</b></a> link.</p>";
Document doc = Jsoup.parse(html);
Element link = doc.select("a").first();
String text = doc.body().text(); // "An example link"
String linkRel = link.attr("rel"); // "someValue"
String html=“链接。”;
Document doc=Jsoup.parse(html);
Element link=doc.select(“a”).first();
字符串text=doc.body().text();//“示例链接”
字符串linkRel=link.attr(“rel”);//“某些价值”
Regex和HTML组合在一起就是这里的脏话。正则表达式在解析HTML或XML等非正则标记方面并不擅长
您最好使用HTML解析器库来实现这一点。在这里,似乎有人做了这件事,名字恰如其分
编辑:-或者jSoup也可以工作。有很多选择 您假设
rel
属性紧跟在?
之后,但情况并非如此。您可以使用以下选项:
Pattern.compile("rel=\"([A-Za-z0-9_]*)\"")
这当然有效,但正如其他人所说,最好使用适当的HTML解析器。下面是一个例子:
这比您的正则表达式方法更干净(更安全(更灵活(更可维护))。我之前查看过该库,但找不到任何实现。请你举个例子好吗?谢谢你给我举个例子。当我使用它时,它工作得很好!唯一的问题是它是这样打印的:
Sanyboi Sanyboi她是我的希望Sanyboi她是我的希望raeiden Sanyboi她是我的希望raeiden E1itez Sanyboi她是我的希望raeiden E1itez krunal930
整个文档。有没有办法一个接一个地打印它们(或者将它们放入ArrayList,每个索引都有一个名称)?编辑:没关系,我是在阅读数据的时候做的,这很好,非常感谢!谢谢你的贡献!
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"));
}