[FIXED] Wie liest man die Datei ohne Codierung und extrahiert die gewünschten URLs mit Python3?

Ausgabe

Umgebung: python3.

Es gibt viele Dateien, von denen einige mit gbk codiert sind, andere mit utf-8.
Ich möchte alle JPG-Dateien mit regulären Ausdrücken extrahieren

Für s.html-Encoding mit gbk.

tree = open("/tmp/s.html","r").read()

UnicodeDecodeError: ‘utf-8’ Codec kann Byte 0xb4 an Position 135 nicht decodieren: ungültiges Startbyte

tree = open("/tmp/s.html","r",encoding="gbk").read()
pat = "http://.+\.jpg"
result = re.findall(pat,tree)
print(result)

[‘ http://somesite/2017/06/0_56.jpg ‘]

Es ist eine große Aufgabe, alle Dateien mit der angegebenen Codierung zu öffnen. Ich möchte eine intelligente Möglichkeit, JPG-URLs in allen Dateien zu extrahieren.

Lösung

Wenn sie eine gemischte Codierung haben, könnten Sie eine Codierung ausprobieren und auf eine andere zurückgreifen:

# first open as binary
with open(..., 'rb') as f:
    f_contents = f.read()
    try:
        contents = f_contents.decode('UTF-8')
    except UnicodeDecodeError:
        contents = f_contents.decode('gbk')
    ...

Wenn es sich um HTML-Dateien handelt, können Sie möglicherweise auch das Codierungs-Tag finden oder sie als Binärdatei mit einer binären Regex durchsuchen:

contents = open(..., 'rb').read()
regex = re.compile(b'http://.+\.jpg')
result = regex.findall(contents)
# now you'll probably want to `.decode()` each of the urls, but you should be able to do that pretty trivially with even the `ASCII` codec

Obwohl ich jetzt darüber nachdenke, möchten Sie wahrscheinlich nicht wirklich Regex verwenden, um die Links zu erfassen, da Sie sich dann mit HTML-Entitäten ( &) befassen müssen und möglicherweise mit etwas wie Pyquery besser zurechtkommen

Hier ist ein kurzes Beispiel mit Pyquery

contents = open(..., 'rb').read()
pq = pyquery.PyQuery(contents)
images = pq.find('img')
for img in images:
   img = pyquery.PyQuery(img)
   if img.attr('src').endswith('.jpg')
       print(img.attr('src'))

Nicht auf meinem Computer mit installierten Dingen, daher kann die Laufleistung mit diesen Codebeispielen variieren


Beantwortet von –
Anthony Sottile


Antwort geprüft von –
Dawn Plyler (FixError Volunteer)

0 Shares:
Leave a Reply

Your email address will not be published. Required fields are marked *

You May Also Like