首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >duckduckgo API不返回结果

duckduckgo API不返回结果
EN

Stack Overflow用户
提问于 2012-07-30 13:20:46
回答 5查看 12.8K关注 0票数 17

编辑--我现在意识到这个API是不够的,甚至不能工作。我想重定向我的问题,我想能够自动搜索duckduckgo使用他们的“我感觉鸭子”。这样,我就可以搜索“堆栈溢出”,并获得主页面("https://stackoverflow.com/")作为我的结果。

我正在使用duckduckgo API。这里

我发现当我使用:

代码语言:javascript
复制
r = duckduckgo.query("example")

结果没有反映出人工搜索,即:

代码语言:javascript
复制
for result in r.results:
    print result

在以下方面的成果:

代码语言:javascript
复制
>>> 
>>> 

没什么。

results中查找索引会导致一个超出界限的错误,因为它是空的。

我怎么才能得到搜索结果呢?

似乎API (根据其文档中的例子)应该回答问题,并以r.answer.text的形式给出一种“我感觉鸭子”的形式。

但是这个网站是以这样一种方式制作的,我无法用正常的方法搜索和解析结果。

我想知道如何使用这个API或任何其他方法从这个站点解析搜索结果。

谢谢。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2012-08-12 16:27:57

如果您访问DuckDuck Go API页面,您会发现一些关于使用API的注释。第一批说明明确指出:

由于这是一个零点击Info,大多数深度查询(非主题名称)将为空白。

A以下是这些字段的列表:

代码语言:javascript
复制
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实现此类解析的示例

代码语言:javascript
复制
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

此脚本打印:

代码语言:javascript
复制
u'Eixample, an inner suburb of Barcelona with distinctive architecture'

在主页上直接查询的问题是它使用JavaScript生成所需的结果(不是相关的主题),所以您可以使用HTML来获得结果。HTML版本有不同的链接:

  • http://duckduckgo.com/?q=example # JavaScript版本
  • http://duckduckgo.com/html/?q=example #HTML版本

让我们看看能得到什么

代码语言:javascript
复制
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

要获得所有链接,您可以遍历找到的标记(除了链接以外的其他数据可以以类似的方式接收)

代码语言:javascript
复制
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版本只包含结果,对于相关搜索,您必须使用JavaScript版本.( html部分在url中)。

票数 30
EN

Stack Overflow用户

发布于 2012-08-19 13:54:08

在得到了我的问题的答案之后,我接受了这个问题,并给出了奖励--我找到了一个不同的解决方案,为了完整,我想在这里补充一下。非常感谢所有帮助我达成这个解决方案的人。尽管这不是我所要求的解决方案,但它可能会对未来的人有所帮助。

在这个网站上经过长时间的艰苦的交谈和一些支持邮件发现:https://duck.co/topic/strange-problem-when-searching-intel-with-my-script

下面是解决方案代码(来自上面发布的线程中的一个答案):

代码语言:javascript
复制
>>> import duckduckgo
>>> print duckduckgo.query('! Example').redirect.url
http://www.iana.org/domains/example
票数 2
EN

Stack Overflow用户

发布于 2012-07-30 14:35:33

尝试:

代码语言:javascript
复制
for result in r.results:
    print result.text
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11722465

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档