Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/375.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Java中从HTML标记属性提取值_Java_Regex - Fatal编程技术网

在Java中从HTML标记属性提取值

在Java中从HTML标记属性提取值,java,regex,Java,Regex,我最近接受了一项社区挑战,我正在尝试提取以下行中“rel”标记的值: 原因是这个挑战要求我从成员列表(具有与其帐户相关属性的人员列表)中提取多个用户的姓名。我不必使用正则表达式,但我觉得这是最好的。我看过一篇关于为什么正则表达式不好的经典文章,但我也看过一些文章说,将它用于类似的东西并不是一件坏事 以下是我迄今为止所做的工作: public class Parser { public static void main(String[] arguments) { new Parser(

我最近接受了一项社区挑战,我正在尝试提取以下行中“rel”标记的值:

原因是这个挑战要求我从成员列表(具有与其帐户相关属性的人员列表)中提取多个用户的姓名。我不必使用正则表达式,但我觉得这是最好的。我看过一篇关于为什么正则表达式不好的经典文章,但我也看过一些文章说,将它用于类似的东西并不是一件坏事

以下是我迄今为止所做的工作:

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"));
}