我在搜索后尝试为输出执行此操作时遇到了一些问题。它没有发生任何事情,比如打开网络浏览器。我做错什么了吗?非常感谢您的提示和建议。这是我从上面的书中输入的代码:
#! /usr/bin/env python3
# searchpypi.py - Opens several search results.
import requests, sys, webbrowser, bs4
print('Searching...') # display text while downloading the search result page
res = requests.get('https://www.duckduckgo.com/search?q='+''.join(sys.argv[1:]))
res.raise_for_status()
# TODO: Retrieve top search result links.
soup = bs4.BeautifulSoup(res.text, 'html.parser')
# TODO: Open a browser tab for each result.
linkElems = soup.select('.package-snippet')
for elem in linkElems[:5]: # first 5 elements in list
urlToOpen = 'https://pypi.org' + elem.get('href')
print('Opening', urlToOpen)
webbrowser.open(urlToOpen)
好的,这里有几件事
通常搜索引擎会看到你带着它认为是机器人的东西来攻击它,并拒绝回答。检查搜索引擎是否有支持的调用方法,并在r http请求期间将用户代理添加到您使用的头中
有一种更好的方法可以使用请求库而不是级联来处理查询字符串
所以代码的请求部分应该看起来像
import requests, sys, webbrowser
from bs4 import BeautifulSoup #save yourself on some unnecessary typing(and possible error) down the line
print('Searching...') # display text while downloading the search result page
parmas = {'q':sys.argv[1:]}
headers = {'user-agent':'Mozilla/5.0 (Linux; rv:1.0)'}
res = requests.get('https://www.duckduckgo.com/search, params=params, headers=headers)
res.raise_for_status()
最后,在使用BeautifulSoup时,您应该考虑使用
lxml
解析器,而不是html.parser
解析器,因为它通常更快,并且在爬网页面时您可能希望这样
当代码完全按照书(第2版(中所写的那样运行时,它不会工作。
你需要更改的一行在书中写得如下:
res = requests.get('https://google.com/search?q=' 'https://pypi.org/search/?q=' + ' '.join(sys.argv[1:]))
要使其工作,只需将代码更改为以下内容:
res = requests.get('https://pypi.org/search/?q=' + ' '.join(sys.argv[1:]))
尝试将requests.get
行更改为以下行:
res = requests.get('http://pypi.org/search/?q=' + ' '.join(sys.argv[1:]))
从命令行运行以下命令(假设文件名为第12_searchpypi.py章(:
python "Chapter 12_searchpypi.py" "boring stuff"