Ошибка значения: чтение закрытого файла

#python #beautifulsoup #python-requests #web-crawler

#python #beautifulsoup #python-запросы #веб-сканер

Вопрос:

Я пытаюсь проанализировать некоторые страницы с помощью BeautifulSoup, но для некоторых ссылок открывалка не работает. Вот код для открывателя:

 class URLopener(urllib.request.FancyURLopener):
    version = "Mozilla/5.0"
    def http_error_default(self, url, fp, errcode, errmsg, headers):
        if errcode == 403:
            raise ValueError("403")
        return super(URLopener, self).http_error_default(
            url, fp, errcode, errmsg, headers
        )
  

Теперь, когда он пытается открыть и проанализировать некоторые страницы с этим кодом:

 opener = URLopener()
page = opener.open(url)
soup = BeautifulSoup(page.read(), features='lxml')
links = soup.findAll("a", href=True)
  

это работает нормально. Но когда он переходит к ссылке, подобной этой:

http://scholar.google.com/citations?view_op=search_authors&hl=en&mauthors=label:deep_learning

он внезапно останавливается и показывает ошибку:

введите описание изображения здесь

Как я могу отфильтровать искомые страницы, чтобы избежать этой проблемы? Мне не обязательно нужны все страницы в результате поиска.

Комментарии:

1. Вы могли бы попробовать urllib.parse.unquote(url)

Ответ №1:

Некоторые из ваших URL-адресов заключены в кавычки. Это можно легко удалить, используя unquote() функцию Python следующим образом:

 import urllib.parse


opener = URLopener()
page = opener.open(urllib.parse.unquote(url))
soup = BeautifulSoup(page.read(), features="lxml")
links = soup.find_all("a", href=True)
  

Это преобразует приведенный вами пример URL-адреса в следующий формат:

 http://scholar.google.com/citations?view_op=search_authorsamp;hl=enamp;mauthors=label:deep_learning