Как открыть ссылку в Python. Работа с WebBrowser и решение проблемы с Internet Explorer

В ходе работы над курсачом для универа столкнулся со стандартным модулем Python — WebBrowser. Через этот модуль я хотел реализовать работу голосового помощника — Lora с дефолтным браузером, но всё пошло не так гладко как ожидалось. Давайте для начала расскажу вам что это за модуль и как он вообще работает.

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('яблоки')

По логике этого кода должны открыться две вкладки:

  1. Сайт vk.com
  2. Запрос в поисковике — яблоки

Но на деле открывается два разных браузера. Ссылку открывает наш дефолтный браузер, а запрос выполняет Internet Explorer (хоть и стоит Windows 10, но вместо Edge всё равно открывается IE). Как же с этим бороться? Настоящие гуру могут залезть в сам модуль WebBrowser и исправить это там, но мы трезво оценим свои шансы и пойдём по течению.

Раз нам позволяют открывать только ссылки в дефолтном браузере, так и будем открывать только ссылки.

Шаги решения

  1. Делаем поисковый запрос в наш поисковик (яндекс, гугл и т.д. и т.п.)
  2. Вытаскиваем ссылку

  3. И, как уже многие догадались, просто вставляем нашу ссылку без того, что идёт после «text=»
    import webbrowser
    webbrowser.open_new_tab('https://vk.com')
    webbrowser.open_new_tab('https://yandex.ru/search/?lr=10735&text=')
  4. Теперь нужно добавить сам текст запроса либо через "+", либо через "%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. Новость взята с сайта Хабр