You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用BeautifulSoup和Requests过滤mailto链接失败,求解决方案

解决Requests爬虫中mailto链接导致的InvalidSchema错误

问题场景

尝试用BeautifulSoup+Requests编写爬虫,意图过滤mailto://和mailto:格式的链接,但爬取部分网页时仍触发InvalidSchema错误,错误提示找不到mailto://链接的适配连接器。

原过滤代码

for link in links:
    if not link.startswith('mailto://'):
        if not link.startswith('mailto:'):
            if total_urls_visited > max_urls:
                break
            crawl(link, max_urls=max_urls)
            if not link.startswith('GET'):
                continue
            elif link.endswith(ignore_list): #use ignore directly here
                continue
            else:
                print(link)

错误追踪信息

Traceback (most recent call last):
  File "/Users/user/Desktop/site_crawler/get_all_links.py", line 175, in <module>
    reqs = requests.get(internal_link, headers=headers)
  File "/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/site-packages/requests/api.py", line 73, in get
    return request("get", url, params=params, **kwargs)
  File "/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/site-packages/requests/api.py", line 59, in request
    return session.request(method=method, url=url, **kwargs)
  File "/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/site-packages/requests/sessions.py", line 587, in request
    resp = self.send(prep, **send_kwargs)
  File "/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/site-packages/requests/sessions.py", line 695, in send
    adapter = self.get_adapter(url=request.url)
  File "/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/site-packages/requests/sessions.py", line 792, in get_adapter
    raise InvalidSchema(f"No connection adapters were found for {url!r}")
requests.exceptions.InvalidSchema: No connection adapters were found for 'mailto://info@mail.app

有效解决方法

1. 调整过滤逻辑顺序,提前拦截无效链接

原代码的问题是:在判断完非mailto链接后直接调用了crawl,后续的过滤逻辑(如startswith('GET'))在爬取之后执行,导致无效链接已经被传入requests.get()触发错误。

修改后代码:

for link in links:
    # 优先过滤所有mailto格式链接
    if link.startswith(('mailto:', 'mailto://')):
        continue
    # 检查爬取数量限制
    if total_urls_visited > max_urls:
        break
    # 过滤其他不符合要求的链接
    if not link.startswith('GET'):
        continue
    if link.endswith(ignore_list):
        continue
    # 执行爬取和输出
    crawl(link, max_urls=max_urls)
    print(link)

2. 在crawl函数内部增加协议校验

为了彻底避免非HTTP/HTTPS协议链接触发错误,在crawl函数调用requests.get()前增加协议检查:

def crawl(link, max_urls):
    # 只处理HTTP/HTTPS协议的链接
    if not link.startswith(('http://', 'https://')):
        return
    # 原有爬取逻辑
    reqs = requests.get(link, headers=headers)
    content_type = reqs.headers.get('content-type')
    # ... 后续代码

3. 用urlparse标准化解析链接(可选)

针对格式不规范的mailto链接,可通过urlparse准确识别协议类型:

from urllib.parse import urlparse

for link in links:
    parsed_link = urlparse(link)
    # 协议为mailto则直接跳过
    if parsed_link.scheme == 'mailto':
        continue
    # 后续过滤及爬取逻辑
    # ...

内容的提问来源于stack exchange,提问作者mem

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 04:24:18