使用一致的 URL 结构在网页中查询变量实体
query a webpage for variable entity using a consistent URL structure
有人可以帮助我了解如何在我的程序中注入对 this webpage 的查询吗?
有两个参数需要设置,即
"Site:",是您输入语言和站点代码的地方。
&
"Page:",您必须输入页面在连接的站点上显示的准确标题。
URL 总是这样:
https://www.wikidata.org/wiki/Special:ItemByTitle?site=en&page=Mikhail+Bakunin&submit=Search
https://www.wikidata.org/wiki/Special:ItemByTitle?site=en&page=Thomas+Edward+Lawrence&submit=Search
而且语言始终是英语,所以你看,它只是:
https://www.wikidata.org/wiki/Special:ItemByTitle?site=en&page=
废话+
废话&submit=Search
查询该页面的objective是检索与该页面关联的ID值,因此对于Mikhail Bakunin
它是Q27645
而对于T. E. Lawrence
它是Q170596
到达页面后,它成为 URL 的一部分:
https://www.wikidata.org/w/index.php?title=Q170596&site=en&page=Thomas+Edward+Lawrence&submit=Search
但也许我可以使用 beautifulSoup 或 soemthng 将其从页面上删除?(这是一个猜测)
程序需要可泛化,也就是说我们要查找的实体的名称是可变的,它会在程序中发生变化,所以需要考虑到这一点。
我想使用 python 或 php 或其他东西如果更容易的话就不会构成危害人类罪,尽管我更喜欢 java。
更新:
import java.net.*;
import java.io.*;
public class URLConnectionReader
{
public static void main(String[] args) throws Exception
{
URL site = new URL("https://www.wikidata.org/wiki/Special:ItemByTitle?site=en&page=Mikhail+Bakunin&submit=Search");
URLConnection yc = site.openConnection();
BufferedReader in = new BufferedReader(
new InputStreamReader(
yc.getInputStream()));
String inputLine;
while ((inputLine = in.readLine()) != null)
System.out.println(inputLine);
in.close();
}
}
这有点效果,但结果非常混乱。
我想我可以从这个东西里抓出来:
<!-- wikibase-toolbar --><span class="wikibase-toolbar-container"><span class="wikibase-toolbar-item wikibase-toolbar ">[<span class="wikibase-toolbar-item wikibase-toolbar-button wikibase-toolbar-button-edit"><a href="/wiki/Special:SetSiteLink/Q27645">edit</a></span>]</span></span>
但是如何呢?
当您请求 this URL 时,响应是:
HTTP/1.1 302 forced.302
Server: Apache
X-Powered-By: HHVM/3.3.1
Expires: Thu, 01 Jan 1970 00:00:00 GMT
Vary: Accept-Encoding,X-Forwarded-Proto,Cookie
X-Content-Type-Options: nosniff
Location: http://www.wikidata.org/w/index.php?title=Q27645&site=en&page=Mikhail+Bakunin&submit=Search
Content-Type: text/html; charset=utf-8
X-Varnish: 1641959068, 1690824779, 1606045625
Via: 1.1 varnish, 1.1 varnish, 1.1 varnish
Transfer-Encoding: chunked
Date: Fri, 17 Apr 2015 11:49:55 GMT
Age: 0
Connection: keep-alive
X-Cache: cp1054 miss (0), cp3003 miss (0), cp3013 frontend miss (0)
Cache-Control: private, s-maxage=0, max-age=0, must-revalidate
Set-Cookie: GeoIP=NL:XXX:51.4400:5.6194:v4; Path=/; Domain=.wikidata.org
所以有一个 302 redirect in the HTTP response headers. That's where you'll want to grab your Q-number. Simlpy regex it out of the Location
header 正则表达式如下:
^Location:.*?title=(Q[0-9]+)
...并使用匹配组 1(应该是 Q27645
)。
要获取 HTTP headers,请查看 this page;它基本上是这样的:
URL obj = new URL("https://www.wikidata.org/wiki/Special:ItemByTitle?site=en&page=Mikhail%20Bakunin&submit=Search");
URLConnection conn = obj.openConnection();
//get header by 'key'
String location = conn.getHeaderField("Location");
//TODO: Regex here
有人可以帮助我了解如何在我的程序中注入对 this webpage 的查询吗?
有两个参数需要设置,即
"Site:",是您输入语言和站点代码的地方。
&
"Page:",您必须输入页面在连接的站点上显示的准确标题。
URL 总是这样:
https://www.wikidata.org/wiki/Special:ItemByTitle?site=en&page=Mikhail+Bakunin&submit=Search
https://www.wikidata.org/wiki/Special:ItemByTitle?site=en&page=Thomas+Edward+Lawrence&submit=Search
而且语言始终是英语,所以你看,它只是:
https://www.wikidata.org/wiki/Special:ItemByTitle?site=en&page=
废话+
废话&submit=Search
查询该页面的objective是检索与该页面关联的ID值,因此对于Mikhail Bakunin
它是Q27645
而对于T. E. Lawrence
它是Q170596
到达页面后,它成为 URL 的一部分:
https://www.wikidata.org/w/index.php?title=Q170596&site=en&page=Thomas+Edward+Lawrence&submit=Search
但也许我可以使用 beautifulSoup 或 soemthng 将其从页面上删除?(这是一个猜测)
程序需要可泛化,也就是说我们要查找的实体的名称是可变的,它会在程序中发生变化,所以需要考虑到这一点。
我想使用 python 或 php 或其他东西如果更容易的话就不会构成危害人类罪,尽管我更喜欢 java。
更新:
import java.net.*;
import java.io.*;
public class URLConnectionReader
{
public static void main(String[] args) throws Exception
{
URL site = new URL("https://www.wikidata.org/wiki/Special:ItemByTitle?site=en&page=Mikhail+Bakunin&submit=Search");
URLConnection yc = site.openConnection();
BufferedReader in = new BufferedReader(
new InputStreamReader(
yc.getInputStream()));
String inputLine;
while ((inputLine = in.readLine()) != null)
System.out.println(inputLine);
in.close();
}
}
这有点效果,但结果非常混乱。
我想我可以从这个东西里抓出来:
<!-- wikibase-toolbar --><span class="wikibase-toolbar-container"><span class="wikibase-toolbar-item wikibase-toolbar ">[<span class="wikibase-toolbar-item wikibase-toolbar-button wikibase-toolbar-button-edit"><a href="/wiki/Special:SetSiteLink/Q27645">edit</a></span>]</span></span>
但是如何呢?
当您请求 this URL 时,响应是:
HTTP/1.1 302 forced.302
Server: Apache
X-Powered-By: HHVM/3.3.1
Expires: Thu, 01 Jan 1970 00:00:00 GMT
Vary: Accept-Encoding,X-Forwarded-Proto,Cookie
X-Content-Type-Options: nosniff
Location: http://www.wikidata.org/w/index.php?title=Q27645&site=en&page=Mikhail+Bakunin&submit=Search
Content-Type: text/html; charset=utf-8
X-Varnish: 1641959068, 1690824779, 1606045625
Via: 1.1 varnish, 1.1 varnish, 1.1 varnish
Transfer-Encoding: chunked
Date: Fri, 17 Apr 2015 11:49:55 GMT
Age: 0
Connection: keep-alive
X-Cache: cp1054 miss (0), cp3003 miss (0), cp3013 frontend miss (0)
Cache-Control: private, s-maxage=0, max-age=0, must-revalidate
Set-Cookie: GeoIP=NL:XXX:51.4400:5.6194:v4; Path=/; Domain=.wikidata.org
所以有一个 302 redirect in the HTTP response headers. That's where you'll want to grab your Q-number. Simlpy regex it out of the Location
header 正则表达式如下:
^Location:.*?title=(Q[0-9]+)
...并使用匹配组 1(应该是 Q27645
)。
要获取 HTTP headers,请查看 this page;它基本上是这样的:
URL obj = new URL("https://www.wikidata.org/wiki/Special:ItemByTitle?site=en&page=Mikhail%20Bakunin&submit=Search");
URLConnection conn = obj.openConnection();
//get header by 'key'
String location = conn.getHeaderField("Location");
//TODO: Regex here