2011-11-13 22 views
26

Diyelim ki div numaralı bir sayfam var. soup.find() ile kolayca div alabilirim.BeautifulSoup innerhtml?

Sonuç olarak, bu div'un WHOLE innerhtml'unu yazdırmak istiyorum: Demek istediğim, tam olarak ipucu gibi, TÜM html etiketleri ve tüm toegether'la bir dizeye ihtiyacım var obj.innerHTML ile javascript almak. Mümkün mü?

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

cevap

11

biri böyle kullanımının bir şey olabilir. Belki biri dokümanları güncellemeli?

+1

unicode (x) –

+1

daha güvenli olabilir, bu bir kaç başka sorunlar vardır. İlk olarak, dize öğeleri içinde html varlıklardan (büyük ve küçüktür) kaçmaz. İkincisi, yorum içeriğini değil, yorum etiketlerini yazacaktır. – ChrisD

+0

Bunu @ChrisD yorumlarına kullanmamak için başka bir neden ekleme: Bu, ASCII olmayan karakterler içeren bir içeriğe UnicodeDecodeError atar. – Anthon

29

yaklaşır DOMs innerHTML method yapar belgelenmemiş işlevi yoktur: Bu, şimdiye kadar benim tüm test durumları geçti

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

seçenekten

+4

Bu, bazı karakterleri HTML öğelerine dönüştürür. Gerçi varsayılan biçimlendirici ('None') ile iyi çalışıyor. – Tgr

+1

Doğru cevap budur. @ peewhy'nin cevabı, ChrisD'nin ana hatlarıyla ifade ettiği nedenlerden dolayı işe yaramaz. – dbkaplun

+2

, bu 'renderContents' için biraz farklı hatalarla yeniden adlandırıldı '(kodlama = DEFAULT_OUTPUT_ENCODING, prettyPrint = False, indentLevel = 0) ' – highvolt

1

Sadece unicode(x)? Benim için iş gibi görünüyor.

Düzeltme: Bu size dış HTML'yi verir ve içsel değil. Yalnızca metin (HTML etiketleri) gerekiyorsa

+0

olarak yeniden adlandırıldı. Bu yalnızca içeriği değil, dış öğe de dahil olmak üzere div döndürecektir. – Arany

+0

Haklısınız. Bunun için şimdi buradan ayrılmak, bu başka birine yardımcı olur. –

-1

, o zaman .text kullanabilirsiniz:

soup.select("div").text