Java 中的 URL:为啥不考虑“+”之后的字符串部分?

Posted

技术标签:

【中文标题】Java 中的 URL:为啥不考虑“+”之后的字符串部分?【英文标题】:URL in Java : Why does the String part after "+" not be considered?Java 中的 URL:为什么不考虑“+”之后的字符串部分? 【发布时间】:2016-01-31 09:19:30 【问题描述】:

我正在与 URL's 合作,更准确地说是在 Stack Overflow 上。

网站URLsquestions 部分的结构是:

/questions/tagged/tag+anotherTag+lastTag

在尝试使用URL 时,我只收到第一个标签的问题。

示例

URL url = null;
InputStream is = null;
BufferedReader br;
String line;

try
    url = new URL("https://***.com/questions/tagged/cobol+hibernate");
    br = new BufferedReader(new InputStreamReader(url.openStream()));

    while ((line = br.readLine()) != null) 
        if (line.contains("<div class=\"tags"))
            System.out.println(line);
        
    
 catch (Exception e)
    e.printStackTrace();

System.out.println(url);

输出

<div class="tags t-cobol">
<div class="tags t-batch-file t-cobol t-mainframe t-vsam">
<div class="tags t-cobol t-mainframe">
<div class="tags t-cobol t-opencobol t-microfocus">
<div class="tags t-cobol">
https://***.com/questions/tagged/cobol+hibernate

预期输出

// Nothing because there is no question under both tags
https://***.com/questions/tagged/cobol+hibernate

实际链接是一个empty page(以这种方式,从来没有将任何问题与两个标签一起发布),正如您所见,代码只查找用第一个标签标识的问题。


Cobol+Hibernate只是一个很好解释问题的例子,我知道把这两个标签放在一起是没有逻辑的。

【问题讨论】:

"实际链接是一个空页面,如您所见,代码仅查找由第一个标签标识的问题。"有趣的是,“空白页面”似乎为我搜索带有两个标签的问题。 @Powerlord Empty,因为它不包含任何包含两个标签的问题... 这是因为加号充当 AND 运算符。它正在搜索包含这两个标签的项目。尝试使用 java+swing 之类的标签,它工作得很好。它给你一个空白页面,因为没有人用 cobol 和 hibernate 作为标签提出问题。 该页面以 UTF-8 编码。您对new InputStreamReader(url.openStream()) 的使用将使用您自己机器的默认字符集读取页面的字节。您的默认字符集是 UTF-8 吗? (如果您在 Windows 上运行,答案是否定的。) @ChaseHenslee 这有点不直观,因为搜索非标签是通过查询字符串完成的。 + 用于替换查询字符串中的空格。 【参考方案1】:

这个curl 命令和输出提供了一些启示:

$ curl 'http://***.com/questions/tagged/cobol+hibernate'
<html><head><title>Object moved</title></head><body>
<h2>Object moved to <a href="/questions/tagged/cobol">here</a>.</h2>
</body></html>

即请求被重定向,丢弃第二个标签。

也是curl -v ...的输出摘录:

< HTTP/1.1 302 Found
< Cache-Control: private
< Content-Type: text/html; charset=utf-8
< Location: /questions/tagged/cobol

看来您需要一些代表才能同时搜索多个标签。如果我在隐身窗口(我没有登录)中打开http://***.com/questions/tagged/cobol+hibernate,则会删除第二个和更多标签。

因此,如果您想在 Java 中执行此查询, 看来您需要以编程方式登录。

我猜这是因为搜索多个标签会给数据库带来负担,因此它的使用仅限于有经验的用户。 你大概可以在 MSE 上得到一个明确的答案。

【讨论】:

这正是我正在寻找的答案。在隐身模式下尝试过,你是完全正确的。谢谢你的时间。您有任何链接可以知道如何以编程方式登录吗? 我已经有一段时间没有使用它了,但是 Stack Exchange API 应该可以帮助解决这个问题:api.stackexchange.com 非常感谢。将定义。看看这个。在这里,接受。

以上是关于Java 中的 URL:为啥不考虑“+”之后的字符串部分?的主要内容,如果未能解决你的问题,请参考以下文章

为啥需要urlEncode

springmvc的问题,URL分号之后的内容读不到这是为啥呢?

为啥安装了anyconnect之后还是连不上网。

字符串是 Java 中的对象,那么我们为啥不使用 'new' 来创建它们呢?

为啥 django page cms get_absolute_url 返回一个空字符串?

为啥 iOS 文件管理使用字符串(路径)和 URL 不一致? [关闭]