WebBrowser — это вшитый в Python модуль, который предоставляет собой высокоуровневый интерфейс, позволяющий просматривать веб-документы.
Для начала работы импортируйте модуль командой:
import webbrowser
Теперь возникает выбор как открыть ссылку. Есть два стула:
1. Написать через одну строчку:
webbrowser.open(url, new=0, autoraise=True)
Например:
webbrowser.open('https://vk.com', new=2)
Если new = 0, URL-адрес открывается, если это возможно, в том же окне браузера. Если переменная new = 1, открывается новое окно браузера, если это возможно. Если new = 2, открывается новая страница браузера («вкладка»), если это возможно.
Значение autoraise можно смело пропускать, ибо оно открывает браузер поверх всех окон, а большинство современных браузеров плюёт на эту переменную даже в значении False.
2. Не мучиться с запоминанием параметров new и писать по-человечески:
webbrowser.open_new(url)
Данная конструкция открывает URL-адрес в новом ОКНЕ браузера по умолчанию, если это возможно, в противном случае откроет URL-адрес в единственном окне браузера.
webbrowser.open_new_tab(url)
В этом случае URL-адрес откроется на новой странице (”tab") браузера по умолчанию, если это возможно, в противном случае эквивалентно open_new ().
Предположим, что вам не нужен браузер по умолчанию. Для выбора браузера существует классная команда .get()
webbrowser.get(using=None)
Грубо говоря, вы просто указываете какой браузер вам использовать.
Например, открытие новой вкладки в Google Chrome:
webbrowser.get(using='google-chrome').open_new_tab('https://vk.com')
Таблица названий браузеров:
Type Name | Class Name |
---|---|
‘mozilla’ | Mozilla(‘mozilla’) |
‘firefox’ | Mozilla(‘mozilla’) |
‘netscape’ | Mozilla(‘netscape’) |
‘galeon’ | Galeon(‘galeon’) |
‘epiphany» | Galeon(‘epiphany’) |
‘skipstone’ | BackgroundBrowser(‘skipstone’) |
‘kfmclient’ | Konqueror() |
‘konqueror» | Konqueror() |
‘kfm’ | Konqueror() |
‘mosaic’ | BackgroundBrowser(‘mosaic’) |
‘opera’ | Opera() |
‘grail’ | Grail() |
‘links’ | GenericBrowser(‘links’) |
‘elinks’ | Elinks(‘elinks’) |
‘lynx’ | GenericBrowser(‘lynx’) |
‘w3m’ | GenericBrowser(‘w3m’) |
‘windows-default’ | WindowsDefault |
‘macosx’ | MacOSX(‘default’) |
‘safari’ | MacOSX(‘safari’) |
‘google-chrome’ | Chrome(‘google-chrome’) |
‘chrome» | Chrome(‘chrome’) |
‘chromium» | Chromium(‘chromium’) |
‘chromium-browser’ | Chromium(‘chromium-browser’) |
Но не всегда получается обойтись одним только .get() и в этом случае на помощь приходит функция .register(), например:
import webbrowser
webbrowser.register('Chrome', None, webbrowser.BackgroundBrowser('C:Program Files (x86)GoogleChromeApplicationchrome.exe'))
webbrowser.get('Chrome').open_new_tab('vk.com')
Мы указали путь к Google Chrome, назвали его и теперь все ссылки открываются только в нём. Надеюсь немного разобрались с модулем WebBrowser и теперь перейдём к моей маленькой проблеме.
Проблема
Как говорилось ранее, для курсового проекта я выбрал создание голосового ассистента. Хотелось его научить переходить по ссылкам и искать информацию в поисковике. Конечно можно было бы «напиповать» множество библиотек для этого, но принципиально хотелось реализовать это через стандартный модуль WebBrowser.
Так как у большинства современных браузеров строка ввода ссылки и поисковая строка это одно и то же, то, казалось бы, можно просто передать запрос туда же, куда передаётся ссылка.
Например:
import webbrowser
webbrowser.open_new_tab('https://vk.com')
webbrowser.open_new_tab('яблоки')
По логике этого кода должны открыться две вкладки:
- Сайт vk.com
- Запрос в поисковике — яблоки
Но на деле открывается два разных браузера. Ссылку открывает наш дефолтный браузер, а запрос выполняет Internet Explorer (хоть и стоит Windows 10, но вместо Edge всё равно открывается IE). Как же с этим бороться? Настоящие гуру могут залезть в сам модуль WebBrowser и исправить это там, но мы трезво оценим свои шансы и пойдём по течению.
Раз нам позволяют открывать только ссылки в дефолтном браузере, так и будем открывать только ссылки.
Шаги решения
- Делаем поисковый запрос в наш поисковик (яндекс, гугл и т.д. и т.п.)
- Вытаскиваем ссылку
- И, как уже многие догадались, просто вставляем нашу ссылку без того, что идёт после «text=»
import webbrowser webbrowser.open_new_tab('https://vk.com') webbrowser.open_new_tab('https://yandex.ru/search/?lr=10735&text=')
- Теперь нужно добавить сам текст запроса либо через "+", либо через "%s"
- Через "+"
webbrowser.open_new_tab('https://yandex.ru/search/?lr=10735&text='+'еда')
- Через "%"
webbrowser.open_new_tab('https://yandex.ru/search/?lr=10735&text=%s'%'еда')
- Но лучше реализовать через format
webbrowser.open_new_tab('https://yandex.ru/search/?lr=10735&text={}'.format('еда'))
- Через "+"
Теперь давайте сделаем так, что пользователь вводит ссылку или запрос, а программа сама понимает какой метод использовать (вызов ссылки или вставить в ссылку запроса).
Для начала мы понимаем, что ссылка несёт в себе домен (.ru, .com и т.д.), в запросе же, как правило, точку не ставят (купить машину, фильм онлайн и т.д.), а в ссылке пробел.
Следовательно, мы будем искать точку и пробел в том, что ввёл пользователь. Реализовать мы сможем это благодаря модулю re, который также изначально встроен в Python. Python предлагает две разные примитивные операции, основанные на регулярных выражениях: match выполняет поиск паттерна в начале строки, тогда как search выполняет поиск по всей строке. Мы воспользуемся операцией search.
import webbrowser
import re
call = input('Введите ссылку или запрос: ')
if re.search(r'.', call):
webbrowser.open_new_tab('https://' + call)
elif re.search(r' ', call):
webbrowser.open_new_tab('https://yandex.ru/search/?text='+call)
else:
webbrowser.open_new_tab('https://yandex.ru/search/?text=' + call)
Немного объясню код.
Пользователь вводит ссылку или текст запроса в переменную call.
if re.search(r'.', call):
webbrowser.open_new_tab('https://' + call)
Первое условие проверяет переменную call на точку внутри неё. Символ » обязателен, иначе модуль не понимает, что перед ним символ точка.
elif re.search(r' ', call):
В этом условии всё тоже самое что и в первом, но проверка ведётся уже на пробел. А пробел говорит о том, что перед нами поисковой запрос.
else:
webbrowser.open_new_tab('https://yandex.ru/search/?text=' + call)
А else, в свою очередь, присваивает всё что написал пользователь без пробелов и точек в поисковый запрос.
Проверка на пробел является обязательной, иначе WebBrowser открывает Internet Explorer.
Всем спасибо за внимание! Надеюсь данная статья кому-нибудь окажется полезной.
Специально для сайта ITWORLD.UZ. Новость взята с сайта Хабр