【问题标题】:Trying to get a string from a website which only has one line试图从只有一行的网站获取字符串
【发布时间】:2019-09-15 17:42:23
【问题描述】:

基本上,我正在尝试从 API 获取字符串,而此 API 只是一个空白页,其中一行包含所需的所有信息,我只是想获取其中的一部分。 这部分是每个人的 ID - 具有相同数量的字符。 API 对每个人都有这一行: {"id":"anExampleUniqueWhichHas32Charact","name": "玩家"} 我有点改变了代码,所以你会明白,因为我正在使用一个专门用于此的库,但我只是想让网络抓取正确。

所以我尝试做的是 Web Scrape 并获取该数量的 string.length。

但它不起作用。

我知道我也可以将 Regex 用于模式,但我真的不知道如何使用它。在这种情况下,Regex 老实说会更有帮助。

public void checkAPI() throws IOException {
    String person = userInput.nextLine(); // It's just any name.
    URL url = new URL("https://api.mojang.com/users/profiles/minecraft/" + 
    person);
    URLConnection con = url.openConnection();
    InputStream isr =con.getInputStream();
    BufferedReader br = new BufferedReader(new InputStreamReader(isr));
    String line;
    while ((line = br.readLine()) != null) {
        if (line.length() == 32) {
            System.out.println(line);
        }
    }
}

我目前只是希望该行能够打印,稍后当它工作时我会将它用于其他东西。 没有抛出任何错误。

【问题讨论】:

  • 网站只有一行,为什么还要检查行长?无论如何打印该行。从那里调试。如果您需要更多帮助,则需要包括您收到的价值、您想要的价值,以及第一个与第二个有何不同的一些解释。
  • edit 您的问题包含minimal reproducible example,提供一个好的 答案几乎是不可能的,因为您的问题目前正在编写。 API 的值是多少? person 的值是多少?是否有任何异常被抛出?如果有,有哪些?你为什么要检查line.length() == 32?为什么不输出每一行?更好的是,为什么不使用调试器并在代码执行时检查变量的值?
  • @JonnyHenly 我改了,希望你能理解得更好。我正在检查 line.length() == 32 以获得那个“id”
  • 来自 Mojang 的 API 的响应被格式化为 json,所以我建议将响应简单地转换为 Json 对象(有很多库:简单的 json、gson、org.json)。使用 json 对象,您可以轻松获取单独的变量,如 id、名称或错误消息
  • 我查看了您正在阅读的webpage 的来源。只有一行有两个键值对,去掉对行长的检查并输出该行。

标签: java url web-scraping


【解决方案1】:

API 使用 Json。 https://de.wikipedia.org/wiki/JavaScript_Object_Notation

您可以使用像 jackson https://en.wikipedia.org/wiki/Jackson_(API) 这样的标准 json 解析器来解析和查询结果。

ObjectMapper mapper = new ObjectMapper();
JsonNode node = mapper.readTree(new URL("https://api.mojang.com/users/profiles/minecraft/KrisJelbring"));
System.out.println("Name: "+node.get("name"));
System.out.println("Id: "+node.get("id"));

但是如果你不喜欢使用jackson,你可以手动完成:但那是胡说,而且不是很稳定:

while ((line = br.readLine()) != null)
{
     int startOfId = line.indexOf("\"id\"") + 4;
     int startOfValue = line.indexOf("\"", startOfId) + 1;
     int endOfValue = line.indexOf("\"", startOfValue);
     System.out.println("id: " + line.substring(startOfValue, endOfValue));
}

【讨论】:

  • 如何使用杰克逊?我已经在网上搜索了如何使用它,但是我无法导入它,我很确定我使用的没有使用 Maven,所以依赖项不起作用,有没有其他方法可以使用是吗?
猜你喜欢
  • 2019-05-13
  • 1970-01-01
  • 1970-01-01
  • 2020-06-20
  • 2013-06-14
  • 2011-07-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多