Arhn - архитектура программирования

Странный формат файла кодирования, выдаваемый BeautifulSoup

Я хотел бы получить доступ и очистить данные от этого

где;

new_url='https://www.scopus.com/results/results.uri?sort=plf-f&src=s&imp=t&sid=2c816e0ea43cf176a59117097216e6d4&sot=b&sdt=b&sl=160&s=%28TITLE-ABS-KEY%28EEG%29AND+TITLE-ABS-KEY%28%22deep+learning%22%29+AND+DOCTYPE%28ar%29%29+AND+ORIG-LOAD-DATE+AFT+1591735287+AND+ORIG-LOAD-DATE+BEF+1592340145++AND+PUBYEAR+AFT+2018&origin=CompleteResultsEmailAlert&dgcid=raven_sc_search_en_us_email&txGid=cc4809850a0eff92f629c95380f9f883'

При доступе к new_url через следующую строку

req = Request(url, headers={'User-Agent': 'Mozilla/5.9'})

выдал ошибку

Webscraping: HTTP Error 302: The HTTP server returned a redirect error that would lead to an infinite loop

Был разработан набор новой линии

req = urllib.request.Request(new_url, None, {'User-Agent': 'Mozilla/5.0 (X11; Linux i686; G518Rco3Yp0uLV40Lcc9hAzC1BOROTJADjicLjOmlr4=) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.157 Safari/537.36','Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8','Accept-Charset': 'ISO-8859-1,utf-8;q=0.7,*;q=0.3','Accept-Encoding': 'gzip, deflate, sdch','Accept-Language': 'en-US,en;q=0.8','Connection': 'keep-alive'})
cj = CookieJar()
opener = urllib.request.build_opener(urllib.request.HTTPCookieProcessor(cj))
raw = opener.open(req).read()

page_soup = soup(raw, 'html.parser')
print(page_soup.prettify())

При этом ошибка не выбрасывается, но

print(page_soup.prettify())

вывести какой-то нераспознанный текстовый формат

6�›�.�t1k�e�LH�.��]WO�?m�^@� څ��#�h[›��!�H8����|����n(XbU‹ ~�k����#g+�4�Ǻ�Xv�7�UȢB2� �7�F8�XA��W\�ɚ��^8w��38�@' SH�‹_0�B�� �oy�5Bspoke)E���GPq:�ќU�c���ab�h�$‹ra� ;o�Q�a@ð�d\�&J3Τa�����:�I �etf�a���h�$(M�~���ua�$� n�&9u%ҵ*b���w�j�V��P�D�'z[� ��������)

с предупреждением

Some characters could not be decoded, and were replaced with REPLACEMENT CHARACTER.

Я подозреваю, что это можно решить, закодировав его с помощью utf-8, как показано ниже.

req = urllib.request.Request(new_url, None, {'User-Agent': 'Mozilla/5.0 (X11; Linux i686; G518Rco3Yp0uLV40Lcc9hAzC1BOROTJADjicLjOmlr4=) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.157 Safari/537.36','Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8','Accept-Charset': 'ISO-8859-1,utf-8;q=0.7,*;q=0.3','Accept-Encoding': 'gzip, deflate, sdch','Accept-Language': 'en-US,en;q=0.8','Connection': 'keep-alive'})
cj = CookieJar()
opener = urllib.request.build_opener(urllib.request.HTTPCookieProcessor(cj))
raw = opener.open(req).read()
with open(raw, 'r', encoding='utf-8') as f:
    page_soup = soup(f, 'html.parser')
    print(page_soup.prettify())

Однако компилятор возвращает ошибку

UnicodeDecodeError: кодек utf-8 не может декодировать байт 0x8b в позиции 1: недопустимый начальный байт

Могу ли я узнать, в чем проблема, признателен за любое понимание.


Ответы:


1

Если вы хотите использовать библиотеку urllib, удалите Accept-Encoding из заголовков (также укажите Accept-Charset только utf-8 для простоты):

req = urllib.request.Request(new_url, None, {'User-Agent': 'Mozilla/5.0 (X11; Linux i686; G518Rco3Yp0uLV40Lcc9hAzC1BOROTJADjicLjOmlr4=) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.157 Safari/537.36','Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8','Accept-Charset': 'utf-8;q=0.7,*;q=0.3','Accept-Language': 'en-US,en;q=0.8','Connection': 'keep-alive'})

Результат:

<!DOCTYPE html>
<!--  Form Name: START -->
<html lang="en">
 <!-- Template_Component_Name: id.start.vm -->
 <head>
  <meta charset="utf-8"/>

...etc.
17.06.2020
  • Спасибо за предложение. Оно работает. Но похоже, что Scopus ограничивает доступ пользователей к своему веб-сайту через небраузерный подход, несмотря на использование подключения к нашему учреждению. Доступ к указанному выше URL-адресу останавливается на главной целевой странице Scopus. 17.06.2020

  • 2

    Попробуйте использовать библиотеку запросов

    import requests
    from bs4 import BeautifulSoup
    
    headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.106 Safari/537.36"}
    
    with requests.Session() as s:
        r = s.get(new_url, headers = headers)
    
    soup = BeautifulSoup(r.text, 'lxml')
    print(soup.get_text())
    

    вы все еще можете использовать файлы cookie здесь

    Изменить: обновлен код, чтобы показать использование заголовков, это сообщит веб-сайту, что вы являетесь браузером, а не программой, но для дальнейших операций входа я бы предложил использовать селен вместо запросов.

    17.06.2020
  • Спасибо за ответ @thf9527, могу я узнать, как включить куки? Судя по всему сайту отказано в доступе. Кажется, они знают, что я захожу через нестандартный браузер 17.06.2020
  • Включите заголовок User-Agent для запроса на получение, чтобы перейти на страницу входа в систему stackoverflow.com/questions/6260457/ 18.06.2020
  • Я бы порекомендовал селен вместо запросов на вашу операцию входа в систему, поскольку, похоже, это связано с javascript. 18.06.2020
  • Новые материалы

    Коллекции публикаций по глубокому обучению
    Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

    Представляем: Pepita
    Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

    Советы по коду Laravel #2
    1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

    Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
    Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

    3 способа решить квадратное уравнение (3-й мой любимый) -
    1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

    Создание VR-миров с A-Frame
    Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

    Демистификация рекурсии
    КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..