Html downloaden und durchsuchen

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
Asder
User
Beiträge: 2
Registriert: Samstag 5. November 2011, 19:46

Hallo,

ich benutze Python 3.2 und versuche gerade eine HTMl herunterzuladen, diese dann nach einem String zu durchsuchen welcher zwischen zwei mir bekannten strings steht.

Beispiel:
DIe HTML file enthält den text:
test1_test2_test=asdfg-xyz
Herausfiltern muss ich das "asdfg", das steht immer zwischen _test= und -xyz und dieses asdfg will ich dann in eine zeile einer datei schreiben(append) sodass ich später die einträge in einem anderen script durchgehen kann

Soweit bin ich:

import urllib.request
import string

html_content = urllib.request.urlopen('http://wwww.test_url.de/index.php')
string_to_search = html_content.read()



wie bekomme ich nun den substring gefunden und in eine datei geschrieben? Ich wollte es mit find machen der jeweils bekannten strings, dadurch erhalte ich die indizes und kann dann den string zwischen den indizes machen, aber ich bekomm immer den fehler expected an object with the buffer interface

Vielen dank im Vorraus
BlackJack

@Asder: `string_to_search` ist semantisch der falsche Name weil das ja nicht die Zeichenkette ist die *ge*sucht ist, sondern die, die *durch*sucht werden soll. Ausserdem ist `string` falsch, denn bei Python 3.x ist das keine Zeichenkette sondern ein Objekt vom Typ `bytes`. Dementsprechend kannst Du da auch nicht einfach Zeichen darin suchen. Du musst entweder die Bytes in Zeichen umwandeln oder nach einer Bytefolge suchen.

Am besten arbeitest Du mal das Tutorial in der Python-Dokumentation, da steht bei Zeichenketten im Abschnitt „About Unicode“ auch etwas zu Sequenzen von Zeichen und Sequenzen von Bytes.
Asder
User
Beiträge: 2
Registriert: Samstag 5. November 2011, 19:46

Das interne tutorial ist bescheiden, und google hilft da leider auch nicht denn python 2.x und 3.x unterscheiden sich so sehr das google treffer ständig nur code für python 2 findet welche bei mir nicht gehen

ok string conversion ist wie in anderen sprachen auch (einfach nen str() benutzen)

nun muss ich noch die zwei indizes nutzen um den string auszulesen und es in ne datei schreiben

falls mir da jemand helfen will, gerne :)
BlackJack

@Asder: Das interne Tutorial finde ich nicht bescheiden. Insbesondere sollte da fast alles drin stehen um diese Aufgabe bewältigen zu können, oder zumindest von dort aus weiterführende Links in die Dokumentation.
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

Vielleicht hilft dies:

Code: Alles auswählen

import re
from urllib.request import urlopen

def extract_charset(response):
    m = re.search('charset=(\S+)', response.getheader('content-type') or '')
    return m and m.group(1) or 'ISO-8859-1'

with urlopen('http://www.python-forum.de') as response:
    data = response.read()

content = data.decode(extract_charset(response))

for m in re.finditer('<p class="forumdesc">(.*?)</p>', content):
    print("*", m.group(1))
Der schwierige Teil ist eigentlich, an die Kodierung der Seite zu kommen. Wie schon gesagt, liefert "read" keinen String sondern ein Byte-Array, das den String in kodierter Form enthält. Die Kodierung muss man kennen, dann man das man das Byte-Array in einen String verwandeln und in dem z.B. mit regulären Ausdrücken suchen. Dummerweise gibt es mehrere Stellen, wo die Kodierung stehen kann. Am einfachsten findet man sie im HTTP-Header, wo sie an den content-type angehängt ist. Fehlt sie dort, wird ISO-8859-1 angenommen. Dummerweise kann sie auch noch ein einem HTTP-EQUIV-Header im Body stehen oder ab HTML5 in einem META-Charset-Element.

Daher ist obiger Ansatz zu umständlich und man sollte diese Arbeit einem (HTML5-kompatiblen) HTML-Parser überlassen. Der kennt die Feinheiten der Spezifikation und kann (hoffentlich) einen korrekten String mit dem Inhalt der Webseite liefern.

Stefan
Antworten