Oluşturulan içeriği elde etmek için Beautiful Soup'u kullanmaya tamamen saygı duyuyorum, ancak bir sayfada oluşturulan içeriği elde etmek için ideal paket olmayabilir.
Oluşturulan içeriği veya tipik bir tarayıcıda görünen içeriği almak için benzer bir sorun yaşadım. Özellikle, aşağıda bu kadar basit bir örnekle çalışmak için pek çok atipik vakam oldu. Bu durumda görüntülenemeyen etiket bir stil etiketinin içine yerleştirildi ve kontrol ettiğim birçok tarayıcıda görünmüyor. Bir sınıf etiketi ayarı görüntüsünü yok olarak tanımlamak gibi başka varyasyonlar da mevcuttur. Sonra bu sınıfı div için kullanarak.
<html>
<title> Title here</title>
<body>
lots of text here <p> <br>
<h1> even headings </h1>
<style type="text/css">
<div > this will not be visible </div>
</style>
</body>
</html>
Yukarıda yayınlanan bir çözüm:
html = Utilities.ReadFile('simple.html')
soup = BeautifulSoup.BeautifulSoup(html)
texts = soup.findAll(text=True)
visible_texts = filter(visible, texts)
print(visible_texts)
[u'\n', u'\n', u'\n\n lots of text here ', u' ', u'\n', u' even headings ', u'\n', u' this will not be visible ', u'\n', u'\n']
Bu çözüm kesinlikle birçok durumda uygulamalara sahiptir ve işi genel olarak oldukça iyi yapar, ancak yukarıda yayınlanan html'de işlenmeyen metni tutar. SO arandıktan sonra buraya birkaç çözüm geldi BeautifulSoup get_text tüm etiketleri ve JavaScript'i kaldırmaz ve burada Python kullanarak HTML'yi düz metne dönüştürür
Bu çözümlerin ikisini de denedim: html2text ve nltk.clean_html ve zamanlama sonuçlarına şaşırdım, bu yüzden gelecek nesillere bir cevap vereceğini düşündüm. Tabii ki, hızlar büyük ölçüde verilerin içeriğine bağlıdır ...
@ Helge'den gelen bir cevap, her şeyde nltk kullanmakla ilgiliydi.
import nltk
%timeit nltk.clean_html(html)
was returning 153 us per loop
İşlenmiş html ile bir dizge döndürmek gerçekten iyi çalıştı. Bu nltk modülü html2text'ten bile daha hızlıydı, ancak html2text daha sağlam olabilir.
betterHTML = html.decode(errors='ignore')
%timeit html2text.html2text(betterHTML)
%3.09 ms per loop
soup.findAll(text=True)
Bu özellik hakkında hiç bilmediğim için +1