2011-11-13 17 views
26

Załóżmy, że mam stronę z div. Mogę łatwo uzyskać to div z soup.find().BeautifulSoup innerhtml?

Teraz mam wynik, chciałbym wydrukować cały innerhtml tego div: To znaczy, że muszę ciąg ze wszystkimi znacznikami HTML i tekst wszystko toegether, dokładnie tak jak struny ja uzyskać javascript z obj.innerHTML. czy to możliwe?

Odpowiedz

11

Jedną z opcji może być użycie coś takiego:

innerhtml = "".join([str(x) for x in div_element.contents]) 
+1

Unicode (x) może być bezpieczniejsze –

+1

Istnieje kilka innych problemów z tym. Po pierwsze, nie zawiera elementów html (takich jak większe i mniejsze niż) w elementach ciągów. Po drugie, napisze treść komentarzy, ale nie same znaczniki komentarzy. – ChrisD

+0

Dodanie innego powodu, aby nie używać tego do komentarzy @ChrisD: Spowoduje to zgłoszenie UnicodeDecodeError w treści zawierającej znaki spoza ASCII. – Anthon

29

Jest nieudokumentowana funkcja, która robi zbliżenie DOMs innerHTML method:

def innerHTML(element): 
    return element.decode_contents(formatter="html") 

ten przeszedł wszystkie moje testów do tej pory. Być może ktoś powinien zaktualizować dokumenty?

+4

Spowoduje to przekształcenie niektórych znaków w elementy HTML. Działa jednak dobrze z domyślnym formaterem ('None'). – Tgr

+1

To jest poprawna odpowiedź. Odpowiedź @ peewhy nie działa z powodów, które przedstawił ChrisD. – dbkaplun

+2

Wygląda na to, że została zmieniona na 'renderContents' z nieco innymi argumentami' (encoding = DEFAULT_OUTPUT_ENCODING, prettyPrint = False, indentLevel = 0) ' – highvolt

1

A może tylko unicode(x)? Wydaje się, że pracujesz dla mnie.

Edytuj: To da ci zewnętrzny HTML, a nie wewnętrzny.

+0

Spowoduje to zwrócenie elementu div zawierającego element zewnętrzny, a nie tylko zawartość. – Arany

+0

Masz rację. Pozostawiam to teraz na wypadek, gdyby to pomogło komuś innemu. –

-1

Jeśli potrzebujesz tylko tekst (bez tagów HTML), a następnie można użyć .text:

soup.select("div").text