-1

有人可以帮助我了解如何在我的程序中注入对该网页的查询吗?

有两个参数需要设置,即

“站点:”是您输入语言和站点代码的地方。

&

“页面:”,您必须输入所连接站点上显示的页面的确切标题。

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

查询该页面的目的是检索与该页面关联的 ID 值,因此 for Mikhail Bakuninit'sQ27645和 for T. E. Lawrenceit'sQ170596

一旦到达页面,它就会成为 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>

但如何?

4

1 回答 1

1

当您请求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

所以HTTP 响应标头中有一个302 重定向这就是您想要获取 Q 号码的地方。Simlpy 使用正则表达式将其从标头中正则表达式:Location

^Location:.*?title=(Q[0-9]+)

...并使用匹配组 1(应该是Q27645)。

要获取 HTTP 标头,请查看此页面;它基本上是这样的:

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
于 2015-04-17T11:48:58.937 回答