使用Beautiful Soup+Python脚本排除指定域名的搜索链接打开
解决方法:添加域名过滤逻辑
嘿,这个需求很常见,其实你只需要在遍历搜索结果链接并打开的循环里添加过滤判断就可以了。不过有个小细节要注意:谷歌搜索结果里的href是跳转链接(格式是/url?q=真实链接&...),所以得先解析出真实的目标URL,才能准确判断域名哦。
具体步骤如下:
- 导入
urllib.parse模块,用来解析URL参数; - 定义你想要排除的域名列表;
- 在循环中先提取真实目标URL,再检查域名是否在排除列表里,只有不在列表中的链接才调用打开方法。
修改后的完整代码如下:
import webbrowser import sys import pyperclip import requests import bs4 from urllib.parse import urlparse, parse_qs # 新增解析URL的模块 def start(): if len(sys.argv) > 1: # 修正原代码的关键词拼接错误:用'+'连接多个搜索关键词 keyword = '+'.join(sys.argv[1:]) else: # 无输入时使用剪贴板内容作为搜索词 keyword = pyperclip.paste() res = requests.get('https://google.com/search?q=' + keyword) soup = bs4.BeautifulSoup(res.text, 'lxml') links = soup.select('.r a') # 在这里添加你要排除的域名,多个域名用逗号分隔 blocked_domains = ['example.com', 'test.org', 'www.example.com'] tab_counts = min(5, len(links)) for i in range(tab_counts): # 构造谷歌跳转链接 google_redirect_link = 'https://google.com' + links[i].get('href') # 解析跳转链接,提取真实的目标URL parsed_redirect = urlparse(google_redirect_link) real_target_url = parse_qs(parsed_redirect.query).get('q', [None])[0] if real_target_url: # 提取目标URL的域名部分 target_domain = urlparse(real_target_url).netloc # 检查域名是否在排除列表,不在则打开链接 if target_domain not in blocked_domains: webbrowser.open(real_target_url) # 直接打开真实链接,跳过谷歌跳转更高效 start()
关键细节说明:
- 修正了原代码的小错误:原代码用
'my+search+term'拼接关键词会导致搜索词混乱,改成'+'才符合谷歌搜索的参数格式; - 解析真实URL:谷歌搜索结果的链接是跳转地址,真实目标藏在
q参数里,必须解析出来才能准确判断域名; - 灵活过滤:如果想排除整个域名后缀(比如所有
.cn域名),可以把判断逻辑改成if not target_domain.endswith('.cn'),按需调整即可。
内容的提问来源于stack exchange,提问作者Mark




