2017-11-15 8 views
-1

Ich habe den folgenden Code:Wie in Python HTML in eine Datei dynamisch schreiben

for item in soup.select('.profile-detail'): 
    f= open('htmlfile.html', 'w') 
    f.write(item) 
    f.close() 

ich Artikel in „htmlfile.html“ schreiben wollen, aber es ist mir die Fehlermeldung geben:

TypeError: write() argument must be str, not Tag

+1

Willkommen bei SO. Bitte posten Sie die vollständige Fehlermeldung. Könnten Sie Ihre Frage auch anders formulieren? "Ich möchte Artikel ..." macht keinen Sinn, da "Artikel" kein Verb ist. Was willst du mit dem "Gegenstand" machen? –

+0

@ Einsames Neuron ich diesen Fehler gefunden: Traceback (jüngste Aufforderung zuletzt): File "lkdn1.py", Zeile 17, in f.write (Artikel) Typeerror: write() Argument str werden muß, nicht Tag –

Antwort

3

Nur str() verwenden den ganzen Tag-Inhalt zu erhalten:

with open('htmlfile.html', 'w') as f: 
    for item in soup.select('.profile-detail'): 
     f.write(str(item) + '\n') # thanks jeteon :p, it's cleaner 
+1

danke für diese Antwort, aber ich möchte den HTML-Code in htmlfile.html schreiben –

+0

@JayPratapPandey: was meinst du ?! – DRPK

+0

Ich möchte den gesamten HTML-Code in 'htmlfile.html' was auch immer in Element speichern. –

1

ich von der soup in Ihrem snipped sammeln dass Sie BeautifulSoup verwenden, um Elemente mit der Klasse "Profildetails" zu extrahieren. Da gibt es zwei Probleme mit dem Code, den Sie haben:

  1. Der Wert item in der Liste der select() Funktion zurückgegeben wird, ist eine Instanz der Tag-Klasse und die die write Methode des Dateiobjekts erwartet einen String . Wie @PRMoureu wrote, können Sie die Tag-Instanz in eine Zeichenfolge und es wird den rohen HTML-String zurückgeben durch Ersetzen der Datei Schreibzeile mit dieser steht:

    f.write(str(item)) 
    
  2. Die Datei, die Sie geöffnet haben in Schreib geöffnet ("w") Modus in der Schleife. Dies bedeutet, dass die Datei für jede Iteration der Schleife überschrieben wird. Wenn Sie versuchen, alle von der Abfrage zurückgegebenen Elemente zu sammeln, erhalten Sie nur die letzte. Wenn Sie alle von ihnen in der Datei haben wollen, sind folgende alternative Möglichkeiten, um es zu beheben:

    # Open the file in append mode 
    for item in soup.select('.profile-detail'): 
        f = open('htmlfile.html', 'a') 
        f.write(item) 
        f.close() 
    

    Dies allerdings nicht so gut ist, da es nicht notwendig ist, zu öffnen und die Datei auf jeder Iteration zu schließen. Wir können die Datei offen halten für alle unsere schreibt:

    # Open and close file just once 
    f = open('htmlfile.html', 'w')   # Okay to open in write mode now 
    for item in soup.select('.profile-detail'): 
        f.write(item) 
        f.write('\n') # In case you're expecting each on a new line 
    f.close() 
    

    Oder mein persönlicher Favorit, ziemlich viel zu tun das gleiche, aber mit Kontexten, so dass Sie nicht über keine Sorge, die f.close() zu vergessen oder es die falsche Vertiefung versehentlich geben oder später etwas:

    # With contexts 
    with open('htmlfile.html', 'w') as f: 
        for item in soup.select('.profile-detail'): 
         f.write(item) 
         f.write('\n') # In case you're expecting each on a new line 
    # File is auto-magically closed by the time you get here