我的目标是使用BeautifulSoup网页搜索Google搜索结果。我正在使用Anaconda Python并使用Ipython作为IDE控制台。为什么在运行以下命令时没有得到ouptput?
def google_scrape(query):
address = "http://www.google.com/search?q=%s&num=100&hl=en&start=0" % (urllib.quote_plus(query))
request = urllib2.Request(address, None, {'User-Agent':'Mosilla/5.0 (Macintosh; Intel Mac OS X 10_7_4) AppleWebKit/536.11 (KHTML, like Gecko) Chrome/20.0.1132.57 Safari/536.11'})
urlfile = urllib2.urlopen(request)
page = urlfile.read()
soup = BeautifulSoup(page)
linkdictionary = {}
for li in soup.findAll('li', attrs={'class':'g'}):
sLink = li.find('a')
print sLink['href']
sSpan = li.find('span', attrs={'class':'st'})
print sSpan
return linkdictionary
if __name__ == '__main__':
links = google_scrape('english')
答案 0 :(得分:0)
您永远不会向linkedDictionary
添加任何内容def google_scrape(query):
address = "http://www.google.com/search?q=%s&num=100&hl=en&start=0" % (urllib.quote_plus(query))
request = urllib2.Request(address, None, {'User-Agent':'Mosilla/5.0 (Macintosh; Intel Mac OS X 10_7_4) AppleWebKit/536.11 (KHTML, like Gecko) Chrome/20.0.1132.57 Safari/536.11'})
urlfile = urllib2.urlopen(request)
page = urlfile.read()
soup = BeautifulSoup(page)
linkdictionary = {}
for li in soup.findAll('li', attrs={'class':'g'}):
sLink = li.find('a')
sSpan = li.find('span', attrs={'class':'st'})
linkeDictionary['href'] = sLink['href']
linkedDictionary['sSpan'] = sSpan
return linkdictionary
if __name__ == '__main__':
links = google_scrape('english')
答案 1 :(得分:0)
Cody Bouche 提到的问题是没有向 dict()
添加任何内容。
在我看来,如果您没有将 {}
(dict) 更改为 []
(array),您将很难更新您的 dict。
附加到数组要简单得多(注意:我在这里可能是错的,这只是以前经验的个人意见)。
要使其以简单的方式工作,您需要将 dict 更改为 array {} --> []
,然后使用 .append({})
附加到 { {1}}
online IDE 中的代码和示例:
list()
如果您仍然想附加到 def google_scrape(query):
html = requests.get(f'https://www.google.com/search?q={query}', headers=headers).text
soup = BeautifulSoup(html, 'lxml')
data = []
for container in soup.findAll('div', class_='tF2Cxc'):
title = container.select_one('.DKV0Md').text
link = container.find('a')['href']
data.append({
'title': title,
'link': link,
})
print(f'{title}\n{link}')
print(json.dumps(data, indent=2))
google_scrape('english')
# part of the outputs:
'''
English language - Wikipedia
https://en.wikipedia.org/wiki/English_language
[
{
"title": "English language - Wikipedia",
"link": "https://en.wikipedia.org/wiki/English_language"
},
]
'''
,那么这是解决此问题的方法之一(仅显示 for 循环的一部分):
dict()
要立即获得 dict 输出,您可以使用来自 SerpApi 的 Google Search Engine Results API 做同样的事情。这是一个付费 API,可免费试用 5,000 次搜索。
本质上,它和上面的代码做同样的事情,但你不需要弄清楚如何做某些事情或试图了解如何抓取某些元素,它已经为最终用户完成了 {{ 1}} 输出,因此唯一需要做的就是迭代 for container in soup.findAll('div', class_='tF2Cxc'):
data_dict = {}
title = container.select_one('.DKV0Md').text
link = container.find('a')['href']
# creates title key and assigns title value
data_dict['title'] = title
# creates link key and assigns link value
data_dict['link'] = link
print(json.dumps(data_dict, indent = 2))
# part of the output:
'''
{
"title": "Minecraft Official Site | Minecraft",
"link": "https://www.minecraft.net/en-us/"
}
'''
并获得所需的输出。
要集成的代码:
JSON
<块引用>
免责声明,我为 SerpApi 工作。