- 内容提要
- 作者简介
- 技术评审者简介
- 致谢
- 译者序 会编程的人不一样
- 前言
- 本书的读者对象
- 编码规范
- 什么是编程
- 本书简介
- 下载和安装 Python
- 启动 IDLE
- 如何寻求帮助
- 聪明地提出编程问题
- 小结
- 第一部分 Python 编程基础
- 第1章 Python 基础
- 第2章 控制流
- 第3章 函数
- 第4章 列表
- 第5章 字典和结构化数据
- 第6章 字符串操作
- 第二部分 自动化任务
- 第7章 模式匹配与正则表达式
- 第8章 读写文件
- 第9章 组织文件
- 第10章 调试
- 第11章 从 Web 抓取信息
- 第12章 处理 Excel 电子表格
- 第13章 处理 PDF 和 Word 文档
- 第14章 处理 CSV 文件和 JSON 数据
- 第15章 保持时间、计划任务和启动程序
- 第16章 发送电子邮件和短信
- 第17章 操作图像
- 第18章 用 GUI 自动化控制键盘和鼠标
- 附录A 安装第三方模块
- 附录B 运行程序
- 附录C 习题答案
11.6 项目:I’m Feeling Lucky Google 查找
每次我在 Google 上搜索一个主题时,都不会一次只看一个搜索结果。通过鼠标中键点击搜索结果链接,或在点击时按住CTRL键,我会在一些新的选项卡中打开前几个链接,稍后再来查看。我经常搜索Google,所以这个工作流程(开浏览器,查找一个主题,依次用中键点击几个链接)变得很乏味。如果我只要在命令行中输入查找主题,就能让计算机自动打开浏览器,并在新的选项卡中显示前面几项查询结果,那就太好了。让我们写一个脚本来完成这件事。
下面是程序要做的事:
· 从命令行参数中获取查询关键字。
· 取得查询结果页面。
· 为每个结果打开一个浏览器选项卡。
这意味着代码需要完成以下工作:
· 从sys.argv中读取命令行参数。
· 用requests模块取得查询结果页面。
· 找到每个查询结果的链接。
· 调用webbrowser.open()函数打开Web浏览器。
打开一个新的文件编辑器窗口,并保存为lucky.py。
第1步:获取命令行参数,并请求查找页面
开始编码之前,你首先要知道查找结果页面的URL。在进行Google查找后,你看浏览器地址栏,就会发现结果页面的URL类似于https://www.google.com/ search?q=SEARCH_TERM_HERE。requests模块可以下载这个页面,然后可以用Beautiful Soup,找到HTML中的查询结果的链接。最后,用webbrowser模块,在浏览器选项卡中打开这些链接。
让你的代码看起来像这样:
#! python3 # lucky.py - Opens several Google search results. import requests, sys, webbrowser, bs4 print('Googling...') # display text while downloading the Google page res = requests.get('http://google.com/search?q=' + ' '.join(sys.argv[1:])) res.raise_for_status() # TODO: Retrieve top search result links. # TODO: Open a browser tab for each result.
用户运行该程序时,将通过命令行参数指定查找的主题。这些参数将作为字符串,保存在sys.argv列表中。
第2步:找到所有的结果
现在你需要使用Beautiful Soup,从下载的HTML中,提取排名靠前的查找结果链接。但如何知道完成这项工作需要怎样的选择器?例如,你不能只查找所有的< a>标签,因为在这个HTML中,有许多链接你是不关心的。因此,必须用浏览器的开发者工具来检查这个查找结果页面,尝试寻找一个选择器,它将挑选出你想要的链接。
在针对Beautiful Soup进行Google查询后,你可以打开浏览器的开发者工具,查看该页面上的一些链接元素。它们看起来复杂得难以置信,大概像这样:< a href="/url?sa=t&rct=j&q=&esrc=s&source=web&cd=1& cad=rja&uact=8&ved=0CCgQFjAA&url=http%3A%2F%2Fwww.crummy.com%2Fsoftware %2FBeautifulSoup%2F& amp;ei=LHBVU_XDD9KVyAShmYDwCw&usg=AFQjCNHAxwplurFOBqg5cehWQEVKi-TuLQ&sig2=sdZu6WVlBlVSDrwhtworMA" onmousedown="return rwt(this,'','','','1','AFQjCNH AxwplurFOBqg5cehWQEVKi- TuLQ','sdZu6WVlBlVSDrwhtworMA','0CCgQFjAA','','',event)" data-href="http://www. crummy.com/software/BeautifulSoup/">< em> BeautifulSoup< /em>: We called him Tortoise because he taught us.< /a>
该元素看起来复杂得难以置信,但这没有关系。只需要找到查询结果链接都具有的模式。但这个< a>元素没有什么特殊,难以和该页面上非查询结果的< a>元素区分开来。
确保你的代码看起来像这样:
#! python3 # lucky.py - Opens several google search results. import requests, sys, webbrowser, bs4 --snip-- # Retrieve top search result links. soup = bs4.BeautifulSoup(res.text) # Open a browser tab for each result. linkElems = soup.select('.r a')
但是,如果从< a>元素向上看一点,就会发现这样一个元素:< h3 class="r">。查看余下的HTML源代码,看起来r类仅用于查询结果链接。你不需要知道CSS类r是什么,或者它会做什么。只需要利用它作为一个标记,查找需要的< a>元素。可以通过下载页面的HTML文本,创建一个BeautifulSoup对象,然后用选择符'.r a',找到所有具有CSS类r的元素中的< a>元素。
第3步:针对每个结果打开Web浏览器
最后,我们将告诉程序,针对结果打开Web浏览器选项卡。将下面的内容添加到程序的末尾:
#! python3 # lucky.py - Opens several google search results. import requests, sys, webbrowser, bs4 --snip-- # Open a browser tab for each result. linkElems = soup.select('.r a') numOpen = min(5, len(linkElems)) for i in range(numOpen): webbrowser.open('http://google.com' + linkElems[i].get('href'))
默认情况下,你会使用webbrowser模块,在新的选项卡中打开前5个查询结果。但是,用户查询的主题可能少于5个查询结果。soup.select()调用返回一个列表,包含匹配'.r a'选择器的所有元素,所以打开选项卡的数目要么是5,要么是这个列表的长度(取决于哪一个更小)。
内建的Python函数min()返回传入的整型或浮点型参数中最小的一个(也有内建的max()函数,返回传入的参数中最大的一个)。你可以使用min()弄清楚该列表中是否少于5个链接,并且将要打开的链接数保存在变量numOpen中。然后可以调用range(numOpen),执行一个for循环。
在该循环的每次迭代中,你使用webbrowser.open(),在Web浏览器中打开一个新的选项卡。请注意,返回的< a>元素的href属性中,不包含初始的http://google.com部分,所以必须连接它和href属性的字符串。
现在可以马上打开前5个Google查找结果,比如说,要查找Python programming tutorials,你只要在命令行中运行lucky python programming tutorials(如何在你的操作系统中方便地运行程序,请参看附录B)。
第4步:类似程序的想法
分选项卡浏览的好处在于,很容易在新选项卡中打开一些链接,稍后再来查看。一个自动打开几个链接的程序,很适合快捷地完成下列任务:
· 查找亚马逊这样的电商网站后,打开所有的产品页面;
· 打开针对一个产品的所有评论的链接;
· 查找Flickr或Imgur这样的照片网站后,打开查找结果中的所有照片的链接。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论