2013-01-05 11 views
5
>>> s = '<div> < 20 </div>' 
>>> import lxml.html 
>>> tree = lxml.html.fromstring(s) 
>>> lxml.etree.tostring(tree) 
'<div> </div>' 

क्या किसी को इसके लिए कोई कामकाज पता है?एलएक्सएमएल पाठ से कम करता है जिसमें 'कम से कम' अक्षर

+1

यह टूटा एचटीएमएल है, लेकिन यह एक दया है कि lxml यह शान से संभाल नहीं कर सकते हैं। जंगली में इस प्रकार का एचटीएमएल बहुत आम है। – speedplane

उत्तर

13

आपका HTML इनपुट टूटा हुआ है; कि < बायां कोण ब्रैकेट को इसके बजाय &lt; पर एन्कोड किया जाना चाहिए था। टूटी हुई एचटीएमएल पार्स करने पर lxml documentation से:

टूटा एचटीएमएल पार्स करने के लिए समर्थन libxml2 की वसूली एल्गोरिथ्म पर पूरी तरह से निर्भर करता है। यह एलएक्सएमएल की गलती नहीं है यदि आपको ऐसे दस्तावेज़ मिलते हैं जो इतने भारी टूटे हुए हैं कि पार्सर उन्हें संभाल नहीं सकता है। इस बात की भी कोई गारंटी नहीं है कि परिणामी पेड़ में मूल दस्तावेज़ से सभी डेटा शामिल होंगे। पार्सिंग रखने के लिए संघर्ष करते समय पार्सर को गंभीर रूप से टूटे हुए हिस्सों को छोड़ना पड़ सकता है। विशेष रूप से गलत स्थानित मेटा टैग इससे पीड़ित हो सकते हैं, जो एन्कोडिंग समस्याओं का कारण बन सकता है।

दूसरे शब्दों में, आप ऐसे दस्तावेजों से प्राप्त कर सकते हैं, जिस तरह से lxml टूटा हुआ HTML हैंडल अन्यथा कॉन्फ़िगर करने योग्य नहीं है।

एक बात आप सकता है कोशिश एक अलग HTML पार्सर उपयोग करने के लिए है। इसके बजाय BeautifulSoup आज़माएं, यह टूटा हुआ HTML हैंडलिंग आपको उस दस्तावेज़ का एक अलग संस्करण देने में सक्षम हो सकता है जो आपको वह चीज़ देता है जो आप चाहते हैं। सुंदर सूप lxml और html5lib समेत विभिन्न पार्सर बैकएंड का पुन: उपयोग कर सकता है, इसलिए यह आपको अधिक लचीलापन देगा।

html5lib पार्सर आप < चरित्र (एक &lt; भागने के लिए परिवर्तित) देता है:

>>> BeautifulSoup("<div> < 20 </div>", "html5lib") 
<html><head></head><body><div> &lt; 20 </div></body></html> 
+0

उह, थोड़ी देर के लिए बहुत अधिक HTML सामान नहीं किया है, '<' के अंत में उस अर्धविराम के बारे में भूल गए :) – Volatility

+3

आपका उत्तर बढ़िया है। एचटीएमएल 5 एलआईबी के साथ बीएस का उपयोग करने पर आपका सुझाव समस्या हल करता है। धन्यवाद। जो लोग कम करते हैं - मुझे लगता है कि वे समस्या को समझ नहीं पाते हैं। – Viacheslav

+1

चूंकि आप पहले से ही 'lxml' का उपयोग कर रहे हैं, यह इंगित करने योग्य है कि इसमें एक [html5parser] (http://lxml.de/html5parser.html) है जो w3c की अनुशंसित पार्सिंग विधियों का पालन करता है (जो सैद्धांतिक रूप से आपका ब्राउज़र उपयोग करता है)। – mlissner

2

आपका < वास्तव में &lt; होना चाहिए, क्योंकि < HTML में 'आरक्षित चरित्र' की तरह सॉर्टा है। फिर यह काम करना चाहिए।

+0

धन्यवाद लेकिन मुझे इसे '<' – Viacheslav

+0

के साथ स्पष्ट रूप से काम करने की आवश्यकता है जो आप चाहते हैं कि यहां कोई विशेष रुचि न हो। आपका मार्कअप अच्छी तरह से गठित नहीं है। ट्रैश मार्कअप को ठीक करने के बारे में कोई एक्सएमएल पार्सर अनुमान लगाने के लिए नहीं है। तो अपने मार्कअप को ठीक करें * पहले * –

+8

आपका नकारात्मक स्वर अप्रासंगिक है। मैं तीसरे भाग वाले एचटीएमएल पेज को स्क्रैप कर रहा हूं और इसे पर्स करने की जरूरत है। उदाहरण जो मैंने दिया है केवल इस मुद्दे को प्रदर्शित करना है। – Viacheslav

संबंधित मुद्दे