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 上。
网站URLs
的questions
部分的结构是:
/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:为啥不考虑“+”之后的字符串部分?的主要内容,如果未能解决你的问题,请参考以下文章
springmvc的问题,URL分号之后的内容读不到这是为啥呢?
字符串是 Java 中的对象,那么我们为啥不使用 'new' 来创建它们呢?