编辑--我现在意识到这个API是不够的,甚至不能工作。我想重定向我的问题,我想能够自动搜索duckduckgo使用他们的“我感觉鸭子”。这样,我就可以搜索“堆栈溢出”,并获得主页面("https://stackoverflow.com/")作为我的结果。
我正在使用duckduckgo API。这里
我发现当我使用:
r = duckduckgo.query("example")结果没有反映出人工搜索,即:
for result in r.results:
print result在以下方面的成果:
>>>
>>> 没什么。
在results中查找索引会导致一个超出界限的错误,因为它是空的。
我怎么才能得到搜索结果呢?
似乎API (根据其文档中的例子)应该回答问题,并以r.answer.text的形式给出一种“我感觉鸭子”的形式。
但是这个网站是以这样一种方式制作的,我无法用正常的方法搜索和解析结果。
我想知道如何使用这个API或任何其他方法从这个站点解析搜索结果。
谢谢。
发布于 2012-08-12 16:27:57
如果您访问DuckDuck Go API页面,您会发现一些关于使用API的注释。第一批说明明确指出:
由于这是一个零点击Info,大多数深度查询(非主题名称)将为空白。
A以下是这些字段的列表:
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版本只包含结果,对于相关搜索,您必须使用JavaScript版本.( html部分在url中)。
发布于 2012-08-19 13:54:08
在得到了我的问题的答案之后,我接受了这个问题,并给出了奖励--我找到了一个不同的解决方案,为了完整,我想在这里补充一下。非常感谢所有帮助我达成这个解决方案的人。尽管这不是我所要求的解决方案,但它可能会对未来的人有所帮助。
在这个网站上经过长时间的艰苦的交谈和一些支持邮件发现:https://duck.co/topic/strange-problem-when-searching-intel-with-my-script
下面是解决方案代码(来自上面发布的线程中的一个答案):
>>> import duckduckgo
>>> print duckduckgo.query('! Example').redirect.url
http://www.iana.org/domains/example发布于 2012-07-30 14:35:33
尝试:
for result in r.results:
print result.texthttps://stackoverflow.com/questions/11722465
复制相似问题