如果你访问DuckDuck Go API Page,你会发现一些关于使用 API 的注意事项。第一个注释清楚地表明:
由于这是一个零点击信息 API,大多数深度查询(非主题名称)将为空白。
这是这些字段的列表:
Abstract: ""
AbstractText: ""
AbstractSource: ""
AbstractURL: ""
Image: ""
Heading: ""
Answer: ""
Redirect: ""
AnswerType: ""
Definition: ""
DefinitionSource: ""
DefinitionURL: ""
RelatedTopics: [ ]
Results: [ ]
Type: ""
所以可能有点遗憾,但他们的 API 只是截断了一堆结果,并没有给你;可能工作得更快,除了使用DuckDuckGo.com之外似乎无能为力。
所以,显然,在这种情况下 API 不是要走的路。
至于我,我只看到了一条出路:从duckduckgo.com检索原始html并使用例如html5lib对其进行解析(值得一提的是,他们的html 结构良好)。
还值得一提的是,解析 html 页面并不是最可靠的数据报废方式,因为 html 结构可以更改,而 API 通常保持稳定,直到公开宣布更改。
下面是如何使用BeautifulSoup实现这种解析的示例:
from BeautifulSoup import BeautifulSoup
import urllib
import re
site = urllib.urlopen('http://duckduckgo.com/?q=example')
data = site.read()
parsed = BeautifulSoup(data)
topics = parsed.findAll('div', {'id': 'zero_click_topics'})[0]
results = topics.findAll('div', {'class': re.compile('results_*')})
print results[0].text
此脚本打印:
u'Eixample, an inner suburb of Barcelona with distinctive architecture'
在主页上直接查询的问题是它使用JavaScript产生所需的结果(不是相关主题),因此您只能使用HTML版本来获取结果。HTML 版本有不同的链接:
让我们看看我们能得到什么:
site = urllib.urlopen('http://duckduckgo.com/html/?q=example')
data = site.read()
parsed = BeautifulSoup(data)
first_link = parsed.findAll('div', {'class': re.compile('links_main*')})[0].a['href']
存储在first_link
变量中的结果是指向搜索引擎输出的第一个结果(不是相关搜索)的链接:
http://www.iana.org/domains/example
要获取所有链接,您可以遍历找到的标签(可以以类似方式接收除链接之外的其他数据)
for i in parsed.findAll('div', {'class': re.compile('links_main*')}):
print i.a['href']
http://www.iana.org/domains/example
https://twitter.com/example
https://www.facebook.com/leadingbyexample
http://www.trythisforexample.com/
http://www.myspace.com/leadingbyexample?_escaped_fragment_=
https://www.youtube.com/watch?v=CLXt3yh2g0s
https://en.wikipedia.org/wiki/Example_(musician)
http://www.merriam-webster.com/dictionary/example
...
请注意,仅 HTML 版本仅包含results,并且对于相关搜索,您必须使用 JavaScript 版本。(html
网址中没有部分)。