webbrowser öffnet Windows Explorer anstelle des Browsers

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
arthuro
User
Beiträge: 2
Registriert: Dienstag 21. April 2020, 12:20

Hallo,
bin noch recht neu im Bereich Python und möchte ein simples Script laufen lassen, dass mir eine Liste von Websites als neue Tabs öffnet.
Das hat auch eine Weile funktioniert, doch wenn ich den Code jetzt ausführe wird der Windows Explorer geöffnet anstelle von Chrome oder Firefox.

Code: Alles auswählen

# Import
import re
import webbrowser
import time

# I/O
filepath        = "D:/Programme/Website/"
download_files  = filepath + "URLs.txt"

with open(download_files, 'r') as file:
    for line in file:
        url = str(re.findall(r'(https?://www.irgendeinesite.com/web/\?Id=\d+)', line))
        if url:
            url = url[2:-2]
            webbrowser.open_new_tab(url)
            time.sleep(10)
Die Voraussetzung dass der Browser bereits geöffnet ist, ist gegegeben.

Wenn ich das ganze um
webbrowser.get('mozilla')
bzw. webbrowser.get('firefox')
oder webbrowser.get('chrome')
oder webbrowser.get('google-chrome')

erhalte ich jeweils die Fehlermeldung:
webbrowser.Error: could not locate runnable browser

Empfehlung war dann noch ein register einzubauen, hier mal mit chrome:

Code: Alles auswählen

chrome_path="C:\\Program Files (x86)\\Google\\Chrome\\Application\\chrome.exe"
webbrowser.register('chrome', None,webbrowser.BackgroundBrowser(chrome_path))
und weiter unten im Code:

Code: Alles auswählen

webbrowser.get('chrome').open_new_tab(url)
zum öffnen

Was dazu führt, dass im erstren Anlauf ein neues Ab mit meinem Installationsverzeichnis von Chrome geöffnet wird und danach immer eine neue Chrome Instanz mit einer leeren Seite. :/

Habe jetzt mal webbrowser.get('windows-default') genutzt und auch dies führt zum Windows Explorer obwohl als Standard Webbrowser Firefox hinterlegt ist. :/
Lasse das ganze unter Windows 10 laufen und hab für die Browser die Standardpfade genutzt und nichts manuell geändert.
Was mich besonders iritiert ist, dass beim allerersten Aufruf Edge genutzt wurde, danach immer Chrome und seit meiner letzten "Anpassung" stur der Windows Explorer.
Benutzeravatar
__blackjack__
User
Beiträge: 14052
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@arthuro: Anmerkungen zum Quelltext: Die Kommentare sind überflüssig.

Pfadteile setzt man nicht mit ``+`` zusammen. Dafür gibt es `pathlib.Path`.

`download_files` ist ein komischer Name für einen Pfad zu einer Datei. Da würde man eher eine Liste oder einen anderen Containertyp erwarten.

Beim öffnen von Textdateien sollte man immer die Kodierung explizit angeben.

`url` ist der falsche Name für eine Zeichenkettendarstellung einer Liste mit URLs. Das ``if url:`` danach wäre auch unsinnig, weil das *immer* wahr ist. Man will aber keine Listen in Zeichenketten umwandeln um danach an der Zeichenkettendarstellung rum zu schrauben. Das ist Murks. Wenn Du das erste Element aus der Liste haben möchtest, dann greif halt einfach auf das erste Element der Liste zu, statt die in eine Zeichenkette umzuwandeln und dann teile der Darstellung einer Liste weg zu schnippeln. Das ist nicht robust. Sollte die Liste mehr als ein Element enthalten ist das Ergebnis davon ja keine URL mehr.

Warum überhaupt `findall()` wenn nur eine URL pro Zeile verarbeitet werden soll? Oder soll mehr als eine URL verarbeitet werden? Dann muss dafür aber auch Code geschrieben werden.

Ungetestet:

Code: Alles auswählen

#!/usr/bin/env python3
import re
import time
import webbrowser
from pathlib import Path


def main():
    base_path = Path("D:/Programme/Website")
    urls_file_path = base_path / "URLs.txt"
    url_re = re.compile(r"(https?://www.irgendeinesite.com/web/\?Id=\d+)")
    with urls_file_path.open("r", encoding="ascii") as lines:
        for match in map(url_re.search, lines):
            if match:
                webbrowser.open_new_tab(match.group(0))
                time.sleep(10)


if __name__ == "__main__":
    main()
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
arthuro
User
Beiträge: 2
Registriert: Dienstag 21. April 2020, 12:20

Wow vielen Dank für die vielen Anregungen. Werde ich alle beherzigen. In der Zwischnezeit hatte ich eine andere Lösung gefunden, wenn diese vielleicht auch nicht ganz so sauber ist:

Hatte das findall durch match ersetzt und das ganze direkt in das IF Statement eingesetzt:

Code: Alles auswählen

with open(download_files, 'r') as file:
    for line in file:
        if re.match(r'(https?://www.udemy.com/course/subscribe/\?courseId=\d+)', line) is not None:
            webbrowser.get('chrome').open_new_tab(line)
            time.sleep(10)
Vorher wurde, wie Du schon schriebst alle Zeilen als Match verarbeitet, was letztlich zu dem Aufruf des falschen Explrorer geführt hat.
Benutzeravatar
__blackjack__
User
Beiträge: 14052
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Das ``is not None`` kann man noch weglassen. `None` ist ”unwahr” und Match-Objekte sind ”wahr”. Wenn man den regulären Ausdruck kompiliert, kann man die `match()`-Methode auch mit `filter()` verwenden (ungetestet):

Code: Alles auswählen

    ...
    with open(download_files, "r", encoding="ascii") as lines:
        url_re = re.compile(
            r"(https?://www.udemy.com/course/subscribe/\?courseId=\d+)"
        )
        chrome = webbrowser.get("chrome")
        for line in filter(url_re.match, lines):
            chrome.open_new_tab(line)
            time.sleep(10)
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
Antworten