ฉันเคารพการใช้ Beautiful Soup เพื่อให้ได้เนื้อหาที่แสดงผล แต่อาจไม่ใช่แพ็คเกจที่เหมาะสำหรับการรับเนื้อหาที่แสดงผลบนหน้าเว็บ
ฉันมีปัญหาคล้ายกันในการรับเนื้อหาที่แสดงผลหรือเนื้อหาที่มองเห็นได้ในเบราว์เซอร์ทั่วไป โดยเฉพาะอย่างยิ่งฉันมีหลายกรณีที่ผิดปกติในการทำงานกับตัวอย่างง่ายๆด้านล่างนี้ ในกรณีนี้แท็กที่ไม่สามารถแสดงได้จะซ้อนอยู่ในแท็กสไตล์และไม่สามารถมองเห็นได้ในหลาย ๆ เบราว์เซอร์ที่ฉันได้ตรวจสอบ มีรูปแบบอื่น ๆ เช่นการกำหนดการตั้งค่าแท็กคลาสแสดงเป็นไม่มี จากนั้นใช้คลาสนี้สำหรับ 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 แล้วมีโซลูชันคู่หนึ่งเกิดขึ้นที่นี่BeautifulSoup get_text ไม่ได้ตัดแท็กและ JavaScript ทั้งหมด และที่นี่แสดง HTML เป็นข้อความธรรมดาโดยใช้ Python
ฉันลองใช้ทั้งสองวิธีนี้: 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)
ไม่เคยรู้มาก่อนเกี่ยวกับคุณลักษณะนั้น