HTML को सादे टेक्स्ट में बदलें, टेक्स्ट के दो पैराग्राफ को एक साथ चिपकने से कैसे रोकें
इस आलेख का लक्ष्य HTML को सादे पाठ में परिवर्तित करते समय पाठ आसंजन की समस्या है, और ब्यूटीफुल सूप में get_text के विभाजक और स्ट्रिप मापदंडों के संयुक्त उपयोग के बारे में विस्तार से बताया गया है। सिंथेटिक DOM परीक्षण मामले और ब्लॉक-स्तरीय/इनलाइन सीमाओं, व्हाइटस्पेस प्रोसेसिंग, स्पष्ट इनपुट तैयारी विधियों और स्वीकृति मानदंड सहित संपूर्ण पायथन अभिकथन कोड प्रदान करता है, और जटिल दस्तावेज़ परिदृश्यों में ओमनीडॉक के लिए पूरक प्रवेश प्रदान करता है।
HTML को सादे पाठ में परिवर्तित करते समय, पाठ के दो पैराग्राफ एक साथ चिपक जाते हैं, ज्यादातर इसलिए क्योंकि get_text() को पृथक्करण रणनीति निर्दिष्ट किए बिना सीधे कहा जाता है। ब्यूटीफुल सूप डिफ़ॉल्ट रूप से सभी टेक्स्ट नोड्स को निर्बाध रूप से सिलाई करता है, और ब्लॉक-स्तरीय तत्वों के बीच की सीमाएं गायब हो जाती हैं। वेब सामग्री निकालने के लिए ब्यूटीफुल सूप का उपयोग करते समय यह समस्या आम है।
निष्कर्षण के बाद कहां तोड़ना है इसका अनुमान लगाने के लिए नियमित अभिव्यक्तियों का उपयोग करने के बजाय, आप निष्कर्षण के दौरान separator और strip मापदंडों को सही ढंग से जोड़ सकते हैं। यह आलेख इस पद्धति को प्रदर्शित करने के लिए सिंथेटिक नमूनों का उपयोग करता है, चलाने योग्य दावा कोड देता है, और बताता है कि किन स्थितियों में मैन्युअल समीक्षा की आवश्यकता होती है।
इस आलेख को पढ़ने के बाद, आप यह निर्धारित कर सकते हैं कि क्या आपके निष्कर्षण परिणाम अटक गए हैं, आउटपुट को सत्यापित करने के लिए अभिकथन स्क्रिप्ट का उपयोग करें, और स्पष्ट करें कि कौन सी समस्याएं पैरामीटर द्वारा हल की जा सकती हैं और जिन्हें बदलने की आवश्यकता है।
यदि मैं HTML को सादे पाठ में परिवर्तित करूं तो मुझे क्या करना चाहिए? एक वाक्य का निष्कर्ष
get_text() को कॉल करने के लिए पहले separator='\n' और strip=True के संयोजन का उपयोग करें, और फिर पृष्ठ स्थिति के अनुसार अप्रासंगिक टैग और संरचनात्मक मुद्दों को संभालें।
| आपकी स्थिति | अनुशंसित प्रथाएँ | कारण |
|---|---|---|
| अनुच्छेदों या सूची आइटमों के बीच का पाठ एक साथ चिपक जाता है | separator='\n' और strip=True दोनों सेट करें | विभाजक पृथक्करण के लिए जिम्मेदार है, पट्टी अग्रणी और अनुगामी रिक्त स्थान को हटा देती है |
| केवल विभाजक सेट है | प्लस strip=True | अन्यथा अर्थहीन इंडेंट वाले स्थान बरकरार रहेंगे |
| केवल स्ट्रिप सेट है | विभाजक भी जोड़ें | पंक्तियाँ अभी भी एक-दूसरे से चिपकी रह सकती हैं |
| पृष्ठ में स्क्रिप्ट जैसे अप्रासंगिक टैग हैं | कॉल करने से पहले ये टैग हटा दें | get_text के पैरामीटर केवल प्रारूप को हल करते हैं, सामग्री की सफाई को नहीं। |
| इसमें टेबल, कैनवास या शैडो डोम शामिल है | संग्रहण योजना बदलें, या छूटी हुई जानकारी स्वीकार करें | इस प्रकार की सामग्री को मापदंडों को समायोजित करके हल नहीं किया जा सकता है |
डिफ़ॉल्ट व्यवहार के जाल और पैरामीटर शब्दार्थ
यह क्यों चिपकता है?
get_text() विधि दो प्रमुख मापदंडों को स्वीकार करती है: separator और strip। यदि कोई पैरामीटर पारित नहीं किया गया है, तो यह टैग ट्री में सभी टेक्स्ट नोड्स को सीधे कनेक्ट कर देगा।
यह डिफ़ॉल्ट व्यवहार div, p और li जैसे ब्लॉक-स्तरीय तत्वों के लिए बहुत समस्याग्रस्त है। HTML स्रोत कोड में लाइन ब्रेक और इंडेंट को अक्सर रिक्त स्ट्रिंग में बदल दिया जाता है या पार्सिंग के बाद अनदेखा कर दिया जाता है, और अर्थ संबंधी सीमाएं गायब हो जाती हैं।
सेपरेटर और स्ट्रिप क्या करते हैं?
- सेपरेटर: टेक्स्ट नोड्स के बीच इंसर्ट को परिभाषित करता है।
'\n'पर सेट करना आम बात है, लेकिन सही नहीं है। यदि HTML गहराई से नेस्टेड है, तो ग्लोबल रैपिंग के परिणामस्वरूप बड़ी संख्या में खाली लाइनें हो सकती हैं। - स्ट्रिप: नियंत्रित करें कि प्रत्येक पाठ खंड के आरंभ और अंत में रिक्त स्थान को हटाया जाए या नहीं। जब
strip=True, ब्यूटीफुल सूप पहले प्रत्येक स्वतंत्र नेविगेबलस्ट्रिंग पर.strip()निष्पादित करेगा, और फिर उन्हें जोड़ने के लिए विभाजक का उपयोग करेगा।
उदाहरण के लिए, <p> Hello </p> को गंदे डेटा आउटपुट के साथ \n Hello \n के बजाय साफ़ Hello मिलेगा।
दोनों का एक साथ उपयोग किया जाना चाहिए:
- बिना पट्टी के केवल विभाजक का उपयोग करने से अर्थहीन इंडेंट वाले स्थान बने रहेंगे।
- केवल पट्टी और बिना विभाजक के, एक लाइन साफ होगी, लेकिन लाइनों के बीच अभी भी आसंजन हो सकता है।
अधिक पैरामीटर विवरण के लिए, कृपया सुंदर सूप आधिकारिक दस्तावेज़ीकरण: get_text() देखें।
सिंथेटिक डोम सीमा परीक्षण मामले
निष्कर्षण तर्क को मान्य करने के लिए, अस्थिर वास्तविक वेब पेजों पर भरोसा करने के बजाय विशिष्ट सीमा समस्याओं वाले सिंथेटिक HTML नमूनों का निर्माण किया जाना चाहिए। निम्नलिखित परीक्षण मामले तीन स्थितियों को कवर करते हैं: ब्लॉक-स्तरीय तत्व आसंजन, इनलाइन तत्व रिक्ति, और अतिरिक्त सफेद स्थान।
इनपुट नमूना (सिंथेटिक उदाहरण):
<div>
<p>第一段文字</p>
<p>第二段文字<span>内联补充</span></p>
<ul>
<li> 列表项A </li>
<li>列表项B</li>
</ul>
</div>
अपेक्षित सही आउटपुट:
第一段文字
第二段文字
内联补充
列表项A
列表项B
यह ध्यान दिया जाना चाहिए कि separator='\n' निकाले गए टेक्स्ट नोड्स पर कार्य करता है और ब्लॉक-स्तरीय टैग के आधार पर स्वचालित रूप से डबल लाइन ब्रेक उत्पन्न नहीं करेगा। पैराग्राफ और सूची आइटम के बीच स्पष्ट रेखा विराम होना चाहिए, और सूची आइटम से पहले और बाद में अतिरिक्त रिक्त स्थान हटा दिए जाने चाहिए। "दूसरा पाठ" और "इनलाइन पूरक" अलग-अलग लेबल में स्थित हैं, और पाठ नोड हैं, इसलिए उन्हें सीमांकक द्वारा अलग किया जाएगा।
त्रुटियाँ और सीमा इनपुट
यदि इनपुट <p>End</p><script>alert(1)</script><p>Start</p> बन जाता है और स्क्रिप्ट टैग फ़िल्टर नहीं किया जाता है, तो आउटपुट में alert(1) होगा। विभाजक सेट होने पर भी यह सत्य है। पाठ में स्क्रिप्ट नोड्स शामिल हैं या नहीं यह पार्सर और नोड प्रकार पर निर्भर करता है।
इसे संभालने का सही तरीका get_text को कॉल करने से पहले अप्रासंगिक टैग को हटाने के लिए soup.find_all('script') का उपयोग करना है, या ट्रैवर्स करते समय विशिष्ट टैग प्रकारों को छोड़ना है। get_text के पैरामीटर केवल प्रारूप समस्या को हल करते हैं, सामग्री सफाई समस्या को नहीं।
पायथन कार्यान्वयन और अभिकथन जाँच
नीचे दिया गया कोड उपरोक्त नमूने को मेमोरी में बनाता है और नियतात्मक सत्यापन करता है। उदाहरण beautifulsoup4 पर निर्भर करता है, और संस्करण 4.9.0 और इसके बाद के संस्करण की अनुशंसा की जाती है।
बाहरी फ़ाइलों का परीक्षण करने के लिए, कृपया HTML को पहले UTF-8 एन्कोडिंग के रूप में सहेजें, और फिर पार्सिंग अपवादों के कारण होने वाली एन्कोडिंग त्रुटियों से बचने के लिए इसे पढ़ने के लिए open('file.html', encoding='utf-8') का उपयोग करें। कोड में कोई नेटवर्क अनुरोध नहीं है और यह पूरी तरह से स्व-निहित है।
from bs4 import BeautifulSoup
# 合成示例:模拟常见的HTML文本边界问题
html_content = """
<div>
<p>第一段文字</p>
<p>第二段文字<span>内联补充</span></p>
<ul>
<li> 列表项A </li>
<li>列表项B</li>
</ul>
</div>
"""
soup = BeautifulSoup(html_content, 'html.parser')
# 关键配置:separator定义边界,strip清理碎片空白
text_result = soup.get_text(separator='\n', strip=True)
# 过滤空行以获得干净的语义行
lines = [line for line in text_result.split('\n') if line]
# 验收断言:确保边界清晰且无脏数据
assert lines[0] == '第一段文字', f"段落粘连或内容错误: {lines[0]}"
assert lines[1] == '第二段文字', "块级元素间未正确分隔"
assert lines[2] == '内联补充', "内联元素文本节点被错误合并"
assert lines[3] == '列表项A', f"列表项前置空格未清除: '{lines[3]}'"
assert lines[4] == '列表项B', "列表项间边界丢失"
print("提取结果预览:")
for i, line in enumerate(lines):
print(f"{i}: [{line}]")
इस कोड का अपेक्षित आउटपुट साफ़ पाठ की पाँच पंक्तियाँ है। यदि आपका वातावरण अधिक रिक्त पंक्तियाँ आउटपुट करता है, तो इसका मतलब है कि DOM में शुद्ध रिक्त नेविगेशनबलस्ट्रिंग नोड हैं जिन्हें हटाया नहीं गया है। यह html.parser का सामान्य व्यवहार है और इसे विभाजन के बाद सूची समझ के साथ फ़िल्टर किया जा सकता है।
इस कोड का उपयोग केवल पैरामीटर संयोजन के सिद्धांत को प्रदर्शित करने के लिए किया जाता है और इसे उत्पादन वातावरण में जटिल पृष्ठों पर सीधे उपयोग नहीं किया जाना चाहिए।
📊 कोर तुलना
| योजना | प्रभाव | सीमाएँ |
|---|---|---|
केवल separator='\n' का उपयोग करें | ब्लॉकों के बीच लाइन ब्रेक हैं | इंडेंटेड स्थान रखें, नेस्टिंग गहरी होने पर बड़ी संख्या में रिक्त रेखाएँ दिखाई दे सकती हैं |
केवल strip=True का उपयोग करें | प्रत्येक पैराग्राफ की शुरुआत और अंत साफ़ करें | पंक्तियाँ अभी भी एक-दूसरे से चिपकी रह सकती हैं |
| एक ही समय में दोनों का प्रयोग करें | पृथक्करण और रिक्त स्थान हटाने दोनों को ध्यान में रखते हुए | अप्रासंगिक टैग को निष्कर्षण से पहले अभी भी हटाने की आवश्यकता है |
| निष्कर्षण के बाद नई पंक्ति का अनुमान लगाने के लिए नियमित अभिव्यक्तियों का उपयोग करें | देखने में लचीला लगता है | अनुशंसित नहीं, निकालते समय मापदंडों के सही संयोजन को प्राथमिकता दी जानी चाहिए |
स्वीकृति मानदंड और मैन्युअल समीक्षा सीमाएँ
स्वचालित निष्कर्षण 100% दृश्य बहाली प्राप्त नहीं कर सकता। निम्न तालिका सूचीबद्ध करती है कि "कोड मरम्मत योग्य" और "मानव हस्तक्षेप की आवश्यकता" स्थितियों के बीच अंतर कैसे किया जाए। निर्णय DOM संरचना पर आधारित है, व्यक्तिपरक भावना पर नहीं।
| निरीक्षण | क्या करें | अनुमान नहीं लगाना चाहिए |
|---|---|---|
| इनलाइन नोड पृथक्करण | जांचें कि क्या वाक्य विभाजित है | डिलीमिटर टेक्स्ट नोड्स पर कार्य करता है |
| टेबल का चपटा होना | प्रसंस्करण के लिए पंक्ति और स्तंभ संरचना को अलग रखें | आप केवल get_text पर भरोसा नहीं कर सकते |
| गतिशील रूप से सामग्री बनाएं | संग्रह अंतराल को पहचानें | स्टेटिक पार्सिंग ब्राउज़र रेंडरिंग के बराबर नहीं है |
अनुपयुक्तता का स्पष्ट दायरा: ब्यूटीफुल सूप तब वैध जानकारी प्राप्त नहीं कर सकता जब HTML में सीएसएस छद्म-तत्वों, कैनवास-रेंडर सामग्री, या शैडो डोम द्वारा उत्पन्न पाठ की एक बड़ी मात्रा होती है। इस समय, मापदंडों को डीबग करना जारी नहीं रखा जाना चाहिए, बल्कि अधिग्रहण योजना को बदला जाना चाहिए, या छूटी हुई जानकारी को स्वीकार किया जाना चाहिए।
🎯कौन सा तरीका आपके लिए उपयुक्त है?
अगर आप……
पैराग्राफ और सूची आइटम का सादा पाठ निकालने की आवश्यकता है
separator='\n' और strip=True दोनों को सेट करें और एक अभिकथन स्क्रिप्ट के साथ आउटपुट को सत्यापित करें।
पेज में कई स्क्रिप्ट या स्टाइल टैग हैं
get_text को कॉल करने से पहले इन टैग को हटा दें, और यह अपेक्षा न करें कि पैरामीटर सामग्री संबंधी समस्याओं का समाधान कर देंगे।
तालिका की पंक्ति और स्तंभ संरचना को बनाए रखने की आवश्यकता है
केवल get_text पर निर्भर न रहें, तालिका संरचना को अलग से संभालें।
पेज ब्राउज़र रेंडरिंग या शैडो डोम पर निर्भर करता है
संग्रहण योजना बदलें, या स्वीकृति के दौरान संग्रहण अंतराल को स्पष्ट रूप से रिकॉर्ड करें।
❓ अक्सर पूछे जाने वाले प्रश्न (FAQ)
1. क्या सिर्फ सेपरेटर सेट करना ही काफी है?
पर्याप्त नहीं। केवल विभाजक सेट करने से अर्थहीन इंडेंटेशन स्थान सुरक्षित रहेंगे, और strip=True जोड़ने की आवश्यकता होगी।
2. आउटपुट में रिक्त पंक्तियाँ क्यों हैं?
DOM में सादे खाली नेविगेशनबलस्ट्रिंग नोड हो सकते हैं जिन्हें हटाया नहीं गया है। यह html.parser का सामान्य व्यवहार है और इसे विभाजन के बाद सूची समझ के साथ फ़िल्टर किया जा सकता है।
3. परिणामों में स्क्रिप्ट टैग क्यों दिखाई देता है?
get_text के पैरामीटर केवल प्रारूप समस्या का समाधान करते हैं। कॉल करने से पहले soup.find_all('script') से हटा दिया जाना चाहिए, या ट्रैवर्सल के दौरान छोड़ दिया जाना चाहिए।
4. कैसे सत्यापित करें कि निष्कर्षण परिणाम सही है या नहीं?
5-10 विशिष्ट किनारे के मामलों का एक सिंथेटिक परीक्षण सेट बनाएं और अभिकथन स्क्रिप्ट चलाएँ। यदि पास दर अपेक्षा से कम है, तो जांचें कि क्या आपको इसे निकालने से पहले DOM को प्रीप्रोसेस करने की आवश्यकता है।
📝सारांश
आसंजन समस्या का मूल निष्कर्षण के दौरान पैरामीटर संयोजन में निहित है, न कि निष्कर्षण के बाद स्ट्रिंग की मरम्मत में। पहले सिंथेटिक नमूनों और दावों को देखें, और फिर वास्तविक पृष्ठ में अप्रासंगिक टैग और संरचनात्मक मुद्दों से निपटें।
इसे अभी आज़माएं: मूल लेआउट को बरकरार रखते हुए अनुवाद शुरू करने के लिए दस्तावेज़ अपलोड करें


