2016-06-19 4 views
0
def crawl(url): 
    html = getHTML(url) # getHTML() retruns HTTPResponse 
    print(html.read()) # PRINT STATMENT 1 
    if (html == None): 
     print("Error getting HTML") 
    else: 
     # parse html 
     bsObj = BeautifulSoup(html, "lxml") 
     # print data 
     try: 
      print(bsObj.h1.get_text()) 
     except AttributeError as e: 
      print(e) 

     print(html.read()) # PRINT STAETMENT 2 

Was ich nicht verstehe ist ..Printing gleichen Httpresponse-Objekt gibt verschiedene Ausgänge - Python

PRINT STATEMENT 1 druckt das ganze html während PRINT STATEMENT 2 druckt nur b''

Was passiert hier? ..Ich bin ziemlich neu in Python.

+0

Als Nebenbemerkung sollten Sie 'html == None' nicht tun. Siehe http://stackoverflow.com/questions/14247373/python-none-comparison-should-i-use-is-or. – edwinksl

+0

@edwinksl ty .. das ist hilfreich – reversiblean

Antwort

1

html ist ein HTTPResponse-Objekt. HTTPResponse unterstützt dateiähnliche Operationen wie read().

Genau wie beim Lesen einer Datei, ein read() verbraucht die verfügbaren Daten und verschiebt den Dateizeiger auf Ende der Datei/Daten. Ein anschließender read() hat nichts zu erwidern.

Sie haben zwei Möglichkeiten:

  1. Setzen Sie den Dateizeiger auf den Anfang nach dem Lesen der seek() Methode:

    print(html.read()) 
    html.seek(0) # moves the file pointer to byte 0 relative to the start of the file/data 
    
  2. Speichern Sie das Ergebnis statt:

    html_body = html.read() 
    print(html_body) 
    

Normalerweise würden Sie die zweite Option verwenden, da es einfacher zu verwenden ist html_body

Verwandte Themen