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)