【问题标题】:Parsing JSON output using Mechanize and Python Django View使用 Mechanize 和 Python Django View 解析 JSON 输出
【发布时间】:2013-08-09 13:47:13
【问题描述】:

我目前正在使用 Python 和 Mechanize 进行网站搜索,例如:site:somedomain.com 进入 BING。

它可以很好地提交到 bing 并返回输出 - 看起来像 Json?我似乎无法找到进一步解析结果的好方法。 是 JSON 吗?

我得到如下输出:

Link(base_url=u'http://www.bing.com/search?q=site%3Asomesite.com', url='http://www.somesite.com/prof.php?pID=478', text='SomeSite -  Professor Rating of Louis Scerbo', tag='a', attrs=[('href', 'http://www.somesite.com/prof.php?pID=478'), ('h', 'ID=SERP,5105.1')])Link(base_url=u'http://www.bing.com/search?q=site%3Asomesite.com', url='http://www.somesite.com/prof.php?pID=527', text='SomeSite -  Professor Rating of Jahan \xe2\x80\xa6', tag='a', attrs=[('href', 'http://www.somesite.com/prof.php?pID=527'), ('h', 'ID=SERP,5118.1')])Link(base_url=u'http://www.bing.com/search?q=site%3Asomesite.com', url='http://www.somesite.com/prof.php?pID=645', text='SomeSite -  Professor Rating of David Kutzik', tag='a', attrs=[('href', 'http://www.somesite.com/prof.php?pID=645'), ('h', 'ID=SERP,5131.1')])

我想获取所有的网址,例如:

http://www.somesite.com/prof.php?pID=478
http://www.somesite.com/prof.php?pID=527
http://www.somesite.com/prof.php?pID=645

等等,所以url里面的属性

如何通过代码中的机械化进一步做到这一点?请记住,未来的一些 url 可能看起来像:

http://www.anothersite.com/dir/dir/dir/send.php?pID=100

谢谢!

【问题讨论】:

  • 如果您使用 Microsoft 的 Azure API 来获取 Bing 结果,您可以将“format=JSON”作为 GET 参数附加到您的请求 URL。然后你会收到一个 JSON 字符串作为响应对象。
  • 您能展示一个仅包含 url 的简短示例吗?附加 format=JSON 时是否重要?
  • 你知道我上面的问题是什么类型的输出吗?我一辈子都找不到它
  • 使用 Python 请求(不能作为注释缩进): req = requests.get(u'api.datamarket.azure.com/Data.ashx/Bing/SearchWeb/…' % urllib.quote(q.encode('utf8'), ''), auth =('', u'YOU_API_KEY')) 结果 = req.json()['d']['results']
  • 这看起来很可怕的评论......我会创建一个正确的答案,即使它不是 100% 准确的问题......

标签: python django json parsing mechanize


【解决方案1】:

mechanize 更像是一个类似于 Python 包的浏览器,对于解析 HTML/XML,我推荐 Lxml,您可以将该数据提供给 lxml 并查找 url。另一种选择是使用正则表达式来查找 url,这种方法会更灵活。

import re 
url_regex = re.compile('http:[^\']+')
urls = re.findall(url_regex, html_text)

编辑:

不是打印output,而是在re.findall() 中传递output 而不是html_text,然后打印urls

【讨论】:

  • @CodeTalk 已编辑,它真的很简单,你必须玩它,findall() 接收一个正则表达式和一个要查看的字符串。编辑了答案。
  • 谢谢!我想我将不得不玩一下这个
  • 一个问题 - 我在 html 上面提供的输出是吗?
【解决方案2】:

使用 Microsoft 的 Azure Datamarket API 和 Python 请求,可以直接请求 JSON 字符串:

import requests, urllib
q = u'Hello World'
q = urllib.quote(q.encode('utf8'), '')
req = requests.get(
    u'https://api.datamarket.azure.com/Data.ashx/Bing/SearchWeb/Web?$format=JSON&Query=%%27%s%%27' % q,
    auth=('', u'YOU_API_KEY')
)
# print req.json()
results = req.json()['d']['results']
list_of_urls = [ r['Url'] for r in results]        

根据您的输入数据,您可能需要也可能不需要“q”的 .encode('utf8') 部分。 “site:xy.com”查询也应该有效,但我没有对此进行测试。此外,我们偶尔会从 Bing 返回一些奇怪的编码......所以我们不得不重新编码返回的 URL,如下所示:

url = r['Url'].encode('latin1')

但那些真的是特殊情况......

您需要注册 Azure API(免费),每月最多 5000 个 Bing 搜索请求是免费的:http://datamarket.azure.com/dataset/bing/search

有几个参数可以微调您的结果:http://datamarket.azure.com/dataset/bing/search#schema

【讨论】:

  • 承认,我听起来有点像 :-) 但是不,我们最初使用的是 Google 的搜索 API,但现在变成了“仅限付费”。 Bing 是(据我所知)唯一一个仍然提供免费 API 的可行搜索引擎——即使请求数量有限。
  • 它不再免费了。
  • 阅读我发布的链接:它每月最多可免费处理 5,000 个请求,我们目前正在我们的项目中使用它。
  • 请求 = 1 是否从一个搜索结果中提取?例如给定查询的第一页,每个附加页都是另一个请求?
  • Python 脚本中的“requests.get”部分是请求。无论您检索哪个内容,调用 API 都算作一次请求。例如。如果您在一个 JSON 响应中获得 100 个搜索结果,则计为一个请求。
猜你喜欢
  • 1970-01-01
  • 2012-04-23
  • 1970-01-01
  • 1970-01-01
  • 2012-02-03
  • 2019-05-18
  • 2022-07-21
  • 2012-06-17
  • 2018-05-06
相关资源
最近更新 更多