2009-04-02 6 views
5

मुझे किसी एप्लिकेशन में डेटा आयात करने के लिए वेब पृष्ठों की एक श्रृंखला का विश्लेषण करना होगा। प्रत्येक प्रकार का वेब पेज एक ही प्रकार का डेटा प्रदान करता है। समस्या यह है कि प्रत्येक पृष्ठ का HTML अलग है, इसलिए डेटा का स्थान बदलता रहता है। एक और समस्या यह है कि एचटीएमएल कोड खराब रूप से स्वरूपित है, जिससे एक्सएमएल-जैसे पार्सर का उपयोग करना असंभव हो जाता है।आप खराब रूप से स्वरूपित HTML फ़ाइल को कैसे पार्स करते हैं?

अब तक, सबसे अच्छी रणनीति मैं के बारे में सोच सकते हैं, पेज के प्रत्येक प्रकार के लिए एक टेम्पलेट परिभाषित करने के लिए है, जैसे:

खाका एक:

<html> 
... 
    <tr><td>Table column that is missing a td 
     <td> Another table column</td></tr> 
    <tr><td>$data_item_1$</td> 
... 
</html> 

खाका बी:

<html> 
... 
    <ul><li>Yet another poorly formatted page <li>$data_item_1$</td></tr> 
... 
</html> 

इस तरह मुझे केवल सभी पृष्ठों के लिए एक सिंगल पार्सर की आवश्यकता होगी, जो प्रत्येक पृष्ठ की तुलना अपने टेम्पलेट के साथ करेगा और $data_item_1$, $data_item_2$ आदि पुनर्प्राप्त करेगा। फिर भी, यह है बहुत काम होने जा रहा है। क्या आप किसी भी सरल समाधान के बारे में सोच सकते हैं? कोई पुस्तकालय जो मदद कर सकता है?

धन्यवाद

उत्तर

8

आपको एक मान्य पेज पाने के लिए साफ के माध्यम से पृष्ठ के स्रोत पारित कर सकते हैं। आप साफ here पा सकते हैं। टडी के पास कई प्रोग्रामिंग भाषाओं के लिए बाइंडिंग है। ऐसा करने के बाद, आप अपने पसंदीदा पार्सर/सामग्री निष्कर्षण तकनीक का उपयोग कर सकते हैं।

+0

मैं पूरी तरह से सहमत हूं। पहले इसे टिडी के माध्यम से पास करें। –

+0

कुछ साफ-सुथरे रैपर यहां उपलब्ध हैं: http://users.rcn.com/creitzel/tidy.html –

2

मैं Html Agility Pack की सिफारिश करता हूं। Xpath का उपयोग करके एक्सएमएल को चयन की तरह आपको खराब संरचित HTML के साथ काम करने की क्षमता है। आपको अभी भी टेम्पलेट आइटम करना होगा या विभिन्न चयनों का चयन करना होगा और विश्लेषण करना होगा, लेकिन यह आपको खराब संरचना कूल्हे से पीछे ले जाएगा।

+0

यह निश्चित रूप से एक शानदार टूल है और इसमें देखने लायक है। पूर्ण स्रोत कोड भी कई उदाहरणों के साथ शामिल है। – Rich

2

जैसा कि here और अन्य SO उत्तर पर बताया गया है, Beautiful Soup अजीब HTML को पार्स कर सकता है।

सुंदर सूप एक पायथन एचटीएमएल/एक्सएमएल पार्सर है जो स्क्रीन-स्क्रैपिंग जैसी त्वरित टर्नअराउंड परियोजनाओं के लिए डिज़ाइन किया गया है। तीन विशेषताएं इसे शक्तिशाली बनाती हैं:

  1. यदि आप इसे खराब मार्कअप देते हैं तो सुंदर सूप चकित नहीं होगा। यह एक पार्स पेड़ पैदा करता है जो आपके मूल दस्तावेज़ के रूप में लगभग उतना ही समझ में आता है। यह आमतौर पर आवश्यक डेटा एकत्र करने और भागने के लिए पर्याप्त होता है।
  2. सुंदर सूप एक पार्स पेड़ को नेविगेट करने, खोजने और संशोधित करने के लिए कुछ सरल तरीकों और पाइथोनिक मुहावरे प्रदान करता है: दस्तावेज़ को विच्छेदन करने और आपको जो चाहिए उसे निकालने के लिए टूलकिट। आपको प्रत्येक एप्लिकेशन के लिए कस्टम पार्सर बनाने की ज़रूरत नहीं है।
  3. सुंदर सूप स्वचालित रूप से इनकमिंग दस्तावेज़ों को यूनिकोड और आउटगोइंग दस्तावेज़ों को यूटीएफ -8 में परिवर्तित करता है। आपको एन्कोडिंग के बारे में सोचना नहीं है, जब तक दस्तावेज़ एन्कोडिंग निर्दिष्ट नहीं करता है और सुंदर सूप एक को स्वत: पहचान नहीं सकता है। फिर आपको मूल एन्कोडिंग निर्दिष्ट करना होगा।

सुंदर सूप आप जो कुछ भी देते हैं उसे पार करते हैं, और पेड़ के ट्रैवर्सल सामान आपके लिए करते हैं। आप इसे "सभी लिंक ढूंढें" या "क्लास बाहरी लिंक के सभी लिंक ढूंढें", या "उन सभी लिंक खोजें जिनके यूआरएल मेल खाते हैं" foo.com ", या" बोल्ड टेक्स्ट प्राप्त करने वाले टेबल शीर्षक को ढूंढें, फिर दें मुझे वह पाठ। "

+0

मुझे 22 सेकंड तक मारो :-( –

1

html5lib जैसे HTML5 पार्सर का उपयोग करें।

एचटीएमएल टिडी के विपरीत, इससे आपको ब्राउजर के बहुत करीब त्रुटि मिल जाएगी।

+1

एचटीएमएल 5 spec पार्सिंग नियमों को मानकीकृत करने का प्रयास करता है जो ब्राउज़र विकृत HTML की व्याख्या करने के लिए उपयोग करते हैं। Hml5lib पायथन में spec का एक खुला कार्यान्वयन है - इसलिए आपको * बिल्कुल * एक ही पार्सिंग व्यवहार मिलेगा यदि आप इसका उपयोग करते हैं तो एचटीएमएल 5 अनुपालन ब्राउज़र के रूप में। आप इसे सुंदर सूप के समान कार्यक्षमता प्राप्त करने के लिए एलएक्सएमएल के साथ संयोजन में उपयोग कर सकते हैं। –

0

नियमित अभिव्यक्तियों को निकालने के लिए आपको आवश्यक डेटा के आधार पर एक विकल्प हो सकता है। मुझे पता है कि बहुत से लोग संरचित डेटा पर RegExes का उपयोग करने के विचार पर चिल्लाएंगे लेकिन सादा तथ्य यह है कि (जैसा कि आपने पाया है) कि बहुत से HTML वास्तव में अच्छी तरह से संरचित नहीं हैं और पार्स करना बहुत मुश्किल हो सकता है।

मुझे आपके लिए एक ही समस्या थी, लेकिन मेरे मामले में मैं केवल पृष्ठ से डेटा का एक विशिष्ट टुकड़ा चाहता था जो HTML को पार्स किए बिना पहचानना आसान था, इसलिए एक RegEx बहुत अच्छी तरह से काम करता था।

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

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