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

В ходе работы на курсачом для универа столкнулся со стандартным модулем Python — WebBrowser. Через этот модуль я хотел реализовать работу голосового ассистента с дефолтным браузером, но всё пошло не так гладко как ожидалось. Давайте для начала расскажу вам что это за модуль и как он вообще работает.
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')


Таблица названий браузеров:
Но не всегда получается обойтись одним только .get () и в этом случае на помощь приходит функция .register (), например:

import webbrowser
webbrowser.register('Chrome', None, webbrowser.BackgroundBrowser('C:\Program Files (x86)\Google\Chrome\Application\chrome.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. Делаем поисковый запрос в наш поисковик (яндекс, гугл и т.д. и т.п.)
    moyqsqsk7rsjztvo5_s8kklslg4.jpeg
  2. Вытаскиваем ссылку

    x9ifhptmb9t3iwa98yuq7mkoi5y.jpeg

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

Теперь давайте сделаем так, что пользователь вводит ссылку или запрос, а программа сама понимает какой метод использовать (вызов ссылки или вставить в ссылку запроса).

Для начала мы понимаем, что ссылка несёт в себе домен (.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.

Всем спасибо за внимание! Надеюсь данная статья кому-нибудь окажется полезной.

© Habrahabr.ru