Форум сайта python.su
Доброго времени суток. Недавно начал изучать Пайтон. В качестве практики решил написать простой парсер выдачи Bing. Но столкнулся с проблемой.
Итак, мой код выглядит вот так:
from requests_html import HTMLSession keywords = [ 'как сделать бумажный самолетик', 'как сделать бумажный кораблик', 'как сделать бумажного журавля' ] session = HTMLSession() for key in keywords: resp = session.get(f'https://www.bing.com/search?q={key}') title = resp.html.xpath('//li[@class="b_algo"][1]//h2//text()') print(title)
[] ['6 лучших схем бумажных корабликов - Поделки из бумаги'] ['Как сложить бумажного журавлика (с иллюстрациями)']
Отредактировано Stargazer (Авг. 22, 2020 20:17:13)
Прикреплённый файлы:
html_как сделать бумажный самолетик.txt (99,5 KБ)
Офлайн
StargazerВ XPath-запросе указан класс b_algo и тег h2. В файле фраза находится теге li класса b_no и теге h1.
При этом получаю вот такой результат:
title = resp.html.xpath('//li[@class="b_algo"][1]//h2//text()')
Отредактировано py.user.next (Авг. 25, 2020 00:40:00)
Офлайн
py.user.next
Когда ты определил, найден результат/не найден результат/произошла ошибка поиска, ты вставляешь строку в структуру данных для вывода и эту структуру данных для вывода выводишь на экран. Соответственно, твоя структура данных для вывода заполнена тобой, а не текстом со страницы, которого может и не быть, и поэтому на экран всегда выводится всё правильно.
Офлайн
Вам нужно понять что вы делаете. И потом сравнить результаты.
Что вы спросили- в питоне - то и получили. браузер имеет ряд других ключей значений и так далее.
Залезьте немного глубже в кроличью нору. Вы на правильном пути.
Офлайн
StargazerПотому что в браузере ещё работает движок JavaScript. И когда ты загружаешь страницу, на странице есть не только текст, но и указания для браузеров загружать и запускать внутри себя определённые скрипты. А эти скрипты имеют полный доступ к документу, который и отображается браузером у тебя в итоге. То есть не страница отображается, которую ты скачал, а всё вместе собирается в единый документ в оперативной памяти, который потом и отображается. Соответственно, что-то берётся из исходника страницы, что-то устанавливается скриптами. Поэтому на странице могут быть поля пустыми, а в браузере будет показывать текст в этих полях.
Я не могу понять почему по одному и тому же адресу - https://www.bing.com/search?q=как+сделать+бумажный+самолетик - браузер получает один html код, а python совершенно другой?
Отредактировано py.user.next (Авг. 23, 2020 23:52:05)
Офлайн
py.user.next
У тебя, когда результат не найден и для его вывода используются другие теги, ты пытаешься его разобрать как найденный результат по тегам найденного результата.
Офлайн
StargazerВот твой XPath-запросpy.user.nextНе могу понять. Поясни пожалуйста.
У тебя, когда результат не найден и для его вывода используются другие теги, ты пытаешься его разобрать как найденный результат по тегам найденного результата.
StargazerВот твой файл с ненайденными результатамиtitle = resp.html.xpath('//li[@class="b_algo"][1]//h2//text()')
Отредактировано py.user.next (Авг. 25, 2020 00:35:46)
Офлайн
py.user.next
А теперь найди в этом файле b_algo, h2 и текст внутри h2
>>> r = session.get('http://python-requests.org/') >>> r.html.render() >>> r.html.search('Python 2 will retire in only {months} months!')['months'] '<time>25</time>'
Офлайн
StargazerПопробовал это сделать. Вот как говорил здесь, так оно и обстоит.
Дак его там и нет. В этом то и вопрос. Питон получает html в котором нет результатов выдачи. А браузер получает по этому же запросу код с выдачей.
#!/usr/bin/env python3 from requests_html import HTMLSession keywords = [ 'как сделать бумажный самолетик', 'как сделать бумажный кораблик', 'как сделать бумажного журавля' ] session = HTMLSession() for key in keywords: resp = session.get(f'https://www.bing.com/search?q={key}') search_result = resp.html.xpath('//li[@class="b_algo"][1]//h2//text()') if search_result: nodes = [i.encode('latin1').decode('utf-8') for i in search_result] result = (True, ''.join(nodes)) else: nodes = resp.html.xpath('//li[@class="b_no"][1]//h1//text()') result = (False, ''.join(nodes)) status, title = result fmt = 'Result: {:4} Request: {}\n {}' print(fmt.format(('FAIL', 'OK')[status], key, title))
[guest@localhost bingsearch]$ ./bingsearch.py
Result: FAIL Request: как сделать бумажный самолетик
Не удалось найти ни одного результата для как сделать бумажный самолетик
Result: OK Request: как сделать бумажный кораблик
Кораблик из бумаги: 10 вариантов, 120 фото как сделать ...
Result: OK Request: как сделать бумажного журавля
Как сложить бумажного журавлика (с иллюстрациями)
[guest@localhost bingsearch]$
Отредактировано py.user.next (Авг. 25, 2020 14:02:02)
Офлайн
Добавив печенье, которое я взял из браузера, я получил найденные результаты.
#!/usr/bin/env python3 from requests_html import HTMLSession keywords = [ 'как сделать бумажный самолетик', 'как сделать бумажный кораблик', 'как сделать бумажного журавля' ] session = HTMLSession() for key in keywords: cookie = ('_EDGE_S=F=1&SID=28A75AD8CBCA62A8303855E9CA1863C3;' ' _EDGE_V=1; MUID=29136B8A85066B00244864BB84D46AA3; ' 'SRCHD=AF=NOFORM; ' 'SRCHUID=V=2&GUID=C0FFD0A5EA3A49BB9F70BDDD40C53F2D&dmnchg=1; ' 'SRCHUSR=DOB=20200825; ' '_SS=SID=28A75AD8CBCA62A8303855E9CA1863C3; ' '_HPVN=CS=eyJQbiI6eyJDbiI6MSwiU3QiOjAsIlFzIjowLCJQcm9kIjoiUC' 'J9LCJTYyI6eyJDbiI6MSwiU3QiOjAsIlFzIjowLCJQcm9kIjoiSCJ9LCJRe' 'iI6eyJDbiI6MSwiU3QiOjAsIlFzIjowLCJQcm9kIjoiVCJ9LCJBcCI6dHJ1' 'ZSwiTXV0ZSI6dHJ1ZSwiTGFkIjoiMjAyMC0wOC0yNVQwMDowMDowMFoiLCJ' 'Jb3RkIjowLCJEZnQiOm51bGwsIk12cyI6MCwiRmx0IjowLCJJbXAiOjJ9; ' 'MUIDB=29136B8A85066B00244864BB84D46AA3') resp = session.get(f'https://www.bing.com/search?q={key}', headers={'Cookie': cookie}) search_result = resp.html.xpath('//li[@class="b_algo"][1]//h2//text()') if search_result: nodes = [i.encode('latin1').decode('utf-8') for i in search_result] result = (True, ''.join(nodes)) else: nodes = resp.html.xpath('//li[@class="b_no"][1]//h1//text()') result = (False, ''.join(nodes)) status, title = result fmt = 'Result: {:4} Request: {}\n {}' print(fmt.format(('FAIL', 'OK')[status], key, title))
[guest@localhost bingsearch]$ ./bingsearch.py
Result: OK Request: как сделать бумажный самолетик
Как сделать далеко летающий самолет из бумаги. Оригами ...
Result: OK Request: как сделать бумажный кораблик
Кораблик из бумаги: 10 вариантов, 120 фото как сделать ...
Result: OK Request: как сделать бумажного журавля
Как сложить бумажного журавлика (с иллюстрациями)
[guest@localhost bingsearch]$
Отредактировано py.user.next (Авг. 25, 2020 22:22:46)
Офлайн