首页 > 解决方案 > 如何处理 InvalidSchema 异常

问题描述

我在 python 中使用其中的两个函数编写了一个脚本。第一个函数get_links()从网页中获取一些链接并将这些链接返回给另一个函数get_info()。此时,该函数get_info()应该从不同的链接生成不同的商店名称,但它会引发错误raise InvalidSchema("No connection adapters were found for '%s'" % url)

这是我的尝试:

import requests
from urllib.parse import urljoin
from bs4 import BeautifulSoup

def get_links(url):
    response = requests.get(url)
    soup = BeautifulSoup(response.text,"lxml")
    elem = soup.select(".info h2 a[data-analytics]")
    return get_info(elem)

def get_info(url):
    response = requests.get(url)
    print(response.url)
    soup = BeautifulSoup(response.text,"lxml")
    return soup.select_one("#main-header .sales-info h1").get_text(strip=True)

if __name__ == '__main__':
    link = 'https://www.yellowpages.com/search?search_terms=%20Injury%20Law%20Attorneys&geo_location_terms=California&page=2'    
    for review in get_links(link):
        print(urljoin(link,review.get("href")))

我在这里尝试学习的关键是现实生活中的用法return get_info(elem)

我为此创建了另一个线程return get_info(elem)链接到那个线程

当我尝试以下操作时,我会得到相应的结果

def get_links(url):
    response = requests.get(url)
    soup = BeautifulSoup(response.text,"lxml")
    elem = soup.select(".info h2 a[data-analytics]")
    return elem

def get_info(url):
    response = requests.get(url)
    soup = BeautifulSoup(response.text,"lxml")
    return soup.select_one("#main-header .sales-info h1").get_text(strip=True)

if __name__ == '__main__':
    link = 'https://www.yellowpages.com/search?search_terms=%20Injury%20Law%20Attorneys&geo_location_terms=California&page=2'    
    for review in get_links(link):
        print(get_info(urljoin(link,review.get("href"))))

我的问题:如何根据我尝试使用我的第一个脚本的方式获得结果return get_info(elem)

标签: pythonpython-3.xfunctionweb-scrapingreturn

解决方案


检查每个函数返回的内容。在这种情况下,您的第一个脚本中的函数将永远不会运行。原因是get_info接受一个 URL,而不是其他任何东西。所以很明显,当您运行get_info(elem)where elemis a list of items that are selected by时,您会遇到错误soup.select()

您应该已经知道上述内容,因为您正在迭代第二个脚本的结果,该脚本仅返回列表以获取href元素。因此,如果您想get_info在您的第一个脚本中使用它,将其应用于项目而不是列表,您可以在这种情况下使用列表推导。

import requests
from urllib.parse import urljoin
from bs4 import BeautifulSoup

def get_links(url):
    response = requests.get(url)
    soup = BeautifulSoup(response.text,"lxml")
    elem = soup.select(".info h2 a[data-analytics]")
    return [get_info(urljoin(link,e.get("href"))) for e in elem] 

def get_info(url):
    response = requests.get(url)
    soup = BeautifulSoup(response.text,"lxml")
    return soup.select_one("#main-header .sales-info h1").get_text(strip=True)

link = 'https://www.yellowpages.com/search?search_terms=%20Injury%20Law%20Attorneys&geo_location_terms=California&page=2'

for review in get_links(link): 
    print(review) 

现在你知道第一个函数仍然返回一个列表,但get_info应用到它的元素上,它是如何工作的?get_info接受 URL 而不是列表。从那里开始,因为您已经应用了url_joinand get_infoin get_links,您可以循环它来打印结果。


推荐阅读