Как обработать исключение InvalidSchema - PullRequest
0 голосов
/ 22 ноября 2018

Я написал скрипт на 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)?

1 Ответ

0 голосов
/ 22 ноября 2018

Проверьте, что возвращается каждой функцией.В этом случае функция в вашем первом скрипте никогда не запустится.Причина в том, что get_info принимает URL, а не что-нибудь еще.Таким образом, очевидно, что вы столкнетесь с ошибкой при запуске get_info(elem), где elem - это список элементов, выбранных 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_join и get_info в get_links, вы можете зациклить его, чтобы напечатать результаты.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...