मैं प्रस्तुत सामग्री प्राप्त करने के लिए सुंदर सूप का उपयोग करते हुए पूरी तरह से सम्मान करता हूं, लेकिन यह एक पृष्ठ पर प्रदान की गई सामग्री को प्राप्त करने के लिए आदर्श पैकेज नहीं हो सकता है।
मुझे प्रदान की गई सामग्री, या विशिष्ट ब्राउज़र में दृश्यमान सामग्री प्राप्त करने के लिए एक समान समस्या थी। विशेष रूप से मेरे पास ऐसे कई उदाहरण हैं जो नीचे दिए गए ऐसे सरल उदाहरण के साथ काम करते हैं। इस मामले में गैर-प्रदर्शन योग्य टैग एक शैली टैग में नेस्टेड है, और कई ब्राउज़रों में दिखाई नहीं देता है जिन्हें मैंने जांचा है। अन्य विविधताएं मौजूद हैं जैसे कि क्लास टैग सेटिंग डिस्प्ले को कोई भी परिभाषित नहीं करता है। फिर div के लिए इस वर्ग का उपयोग करना।
<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>
ऊपर पोस्ट किया गया एक समाधान है:
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']
इस समाधान में निश्चित रूप से कई मामलों में एप्लिकेशन हैं और यह काम आम तौर पर काफी अच्छी तरह से करता है लेकिन ऊपर पोस्ट किए गए HTML में यह उस पाठ को बरकरार रखता है जिसका प्रतिपादन नहीं किया गया है। SO की खोज करने के बाद एक युगल समाधान यहाँ आया है सुंदरसोते get_text सभी टैग और जावास्क्रिप्ट को नहीं हटाता है और यहाँ पर HTML को सादे पाठ में पायथन का उपयोग करके रेंडर किया गया है
मैंने इन दोनों समाधानों की कोशिश की: html2text और nltk.clean_html और समय के परिणामों से आश्चर्यचकित हो गया था ताकि उन्हें लगा कि उन्होंने उत्तर देने के लिए उत्तर दिया। बेशक, गति अत्यधिक डेटा की सामग्री पर निर्भर करती है ...
यहाँ @Helge से एक उत्तर सभी चीजों के nltk का उपयोग करने के बारे में था।
import nltk
%timeit nltk.clean_html(html)
was returning 153 us per loop
यह प्रदान की HTML के साथ एक स्ट्रिंग लौटने के लिए वास्तव में अच्छी तरह से काम किया। यह nltk मॉड्यूल html2text से भी तेज था, हालांकि शायद html2text अधिक मजबूत है।
betterHTML = html.decode(errors='ignore')
%timeit html2text.html2text(betterHTML)
%3.09 ms per loop
soup.findAll(text=True)
उस सुविधा के बारे में कभी नहीं जानते थे