2008-11-18 20 views
19

मैंने एक पूरे वेबपृष्ठ के एचटीएमएल को एक स्ट्रिंग में सहेजा है, और अब मैं लिंक से "href" मान को पकड़ना चाहता हूं, अधिमानतः बाद में उन्हें अलग-अलग तारों में सहेजने की क्षमता के साथ। ऐसा करने का सबसे अच्छा तरीका क्या है?सी # - वेब पेज पार्स करने के लिए सर्वश्रेष्ठ दृष्टिकोण?

मैंने स्ट्रिंग को एक .xml दस्तावेज़ के रूप में सहेजने और XPathDocument नेविगेटर का उपयोग करके इसे पार्स करने का प्रयास किया है, लेकिन (आश्चर्य की बात है) यह वास्तव में एक-वास्तव में-XML-दस्तावेज़ को नेविगेट नहीं करता है।

नियमित रूप से अभिव्यक्तियों को प्राप्त करने के लिए सर्वोत्तम तरीका है जो मैं पूरा करने की कोशिश कर रहा हूं?

उत्तर

10

नियमित अभिव्यक्तियां ऐसा करने का एक तरीका है, लेकिन यह समस्याग्रस्त हो सकती है।

अधिकांश HTML पृष्ठों को मानक HTML तकनीकों का उपयोग करके पार्स नहीं किया जा सकता है, जैसा कि आपने पाया है, अधिकांश मान्य नहीं हैं।

आप HTML Tidy या इसी तरह के एक उपकरण को एकीकृत करने का प्रयास कर सकते हैं, लेकिन यह केवल आपको आवश्यक रेगेक्स बनाने के लिए बहुत तेज़ होगा।

अद्यतन

इस अद्यतन मैं 15 प्राप्त हो गया है ऊपर और 9 downvotes के समय। मुझे लगता है कि शायद लोग इस जवाब पर सवाल नहीं पढ़ रहे हैं और न ही टिप्पणियां पढ़ रहे हैं। सभी ओपी करना चाहता था href मूल्यों को पकड़ो। यही वह है। उस परिप्रेक्ष्य से, एक साधारण रेगेक्स ठीक है। अगर लेखक अन्य वस्तुओं को पार्स करना चाहता था तो शुरुआत में कहा गया है कि मैं रेगेक्स की सिफारिश नहीं करता हूं, यह सबसे अच्छा समस्याग्रस्त है।

+0

अच्छा जवाब - regex अपने दोस्त है! –

+23

खराब जवाब। ऐसा मत करो। – SLaks

+8

-1 हम्म, HTML का विश्लेषण करने के लिए Regex का उपयोग कर। क्या गलत होने की सम्भावना है? ओह यह सही है: http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags – Ash

0

यदि आप कम से कम अच्छी तरह से गठित होने के लिए दस्तावेज़ को जानते हैं या ठीक कर सकते हैं तो आपको एक्सएमएल का उपयोग करके अधिक भाग्य हो सकता है। यदि आपके पास अच्छा एचटीएमएल (या बल्कि, xhtml) है, तो नेट में एक्सएमएल सिस्टम इसे संभालने में सक्षम होना चाहिए। दुर्भाग्य से, अच्छा एचटीएमएल बेहद दुर्लभ है।

दूसरी तरफ, नियमित अभिव्यक्ति पार्सिंग एचटीएमएल पर वास्तव में खराब है। सौभाग्य से, आपको एक पूर्ण एचटीएमएल स्पेक को संभालने की आवश्यकता नहीं है। यूआरएल प्राप्त करने के लिए आपको href= तारों को पार्स करने के बारे में चिंता करने की आवश्यकता है। यहां तक ​​कि यह मुश्किल हो सकता है, इसलिए मैं तुरंत इसका प्रयास नहीं करूंगा। इसके बजाय मैं कुछ ग्राउंड नियमों को आजमाने और स्थापित करने के लिए कुछ प्रश्न पूछकर शुरू करूंगा। वे मूल रूप से सभी के लिए "? कितना आप दस्तावेज़ बारे में पता है" नीचे उबाल, लेकिन यहाँ जाता है:

  • क्या आप जानते हैं "href" पाठ हमेशा छोटे अक्षर हो जाएगा तो क्या होगा?
  • क्या आप जानते हैं कि यह हमेशा डबल कोट्स, सिंगल कोट्स या यूआरएल के आसपास कुछ भी नहीं उपयोग करेगा?
  • क्या यह हमेशा एक वैध यूआरएल है, या आपको '#', जावास्क्रिप्ट स्टेटमेंट, और जैसे चीजों के लिए खाते की आवश्यकता है?
  • क्या किसी दस्तावेज़ के साथ काम करना संभव है जहां सामग्री HTML सुविधाओं का वर्णन करती है (IE: href= दस्तावेज़ में भी हो सकता है और एंकर टैग से संबंधित नहीं है)?
  • आप हमें दस्तावेज़ के बारे में और क्या बता सकते हैं?
+0

मुझे पता है कि href टेक्स्ट हमेशा कम मामला होगा। यह हमेशा डबल कोट्स का उपयोग करेगा। यह हमेशा एक वैध यूआरएल हो सकता है या नहीं, लेकिन मुझे लगता है कि यह 99% समय होगा। दस्तावेज़ में कहीं और "href" होने का मौका है। मैं बस इतना सोच सकता हूं। क्या एक पार्सिंग फ़ंक्शन वास्तव में रेगेक्स से बेहतर होगा? – MattSayar

+0

यहां हत्यारा href = कहीं और की अनुमति दे रहा है। यह आपको एक वास्तविक एंकर टैग खोजने के लिए वापस भेजता है, और इसका मतलब है कि आप एक (बहुत उदार) पार्सिंग लाइब्रेरी का उपयोग कर बेहतर हैं। आप इसे वेबब्रोसर नियंत्रण में लोड करने का भी प्रयास कर सकते हैं। –

2

शायद आप राजसी पार्सर की तरह कुछ हैं: http://www.majestic12.co.uk/projects/html_parser.php

वहाँ कुछ अन्य विकल्प है कि परतदार एचटीएमएल के साथ सौदा कर सकते हैं, साथ ही कर रहे हैं। एचटीएमएल एजिलिटी पैक एक नजर के लायक है, जैसा कि किसी और ने उल्लेख किया है।

मुझे नहीं लगता कि रेगेक्स HTML के लिए एक आदर्श समाधान है, क्योंकि HTML संदर्भ-मुक्त नहीं है। अगर वे कमजोर, परिणाम, तो वे शायद पर्याप्त उत्पादन करेंगे; यहां तक ​​कि एक यूआरआई निश्चित रूप से पहचानने के लिए एक गन्दा समस्या है।

1

मैं क्रिस लाइवली से सहमत हूं, क्योंकि HTML अक्सर बहुत अच्छी तरह से गठित नहीं होता है, इसलिए आप इसके लिए नियमित अभिव्यक्ति के साथ सबसे अच्छे हैं।

href=[\"\'](http:\/\/|\.\/|\/)?\w+(\.\w+)*(\/\w+(\.\w+)?)*(\/|\?\w*=\w*(&\w*=\w*)*)?[\"\'] 

here RegExLib से मिलना चाहिए आप

+0

धन्यवाद समय। मैं इसका उपयोग करने की कोशिश कर रहा हूं, हालांकि, सी # मुझे बताता है कि सभी बैकस्लाश "अज्ञात भागने अनुक्रम" हैं। वहां @ @ फेंकने से कोई मदद नहीं मिलती है। क्या आप जानते हैं कि क्या हो रहा है? – MattSayar

+0

हाहा, मेरा मतलब था "धन्यवाद टीआईएम"। समय किसी भी धन्यवाद के लायक नहीं है। – MattSayar

+0

इस लिंक ने मुझे यह समझने में मदद की http://regexadvice.com/forums/thread/36529.aspx – MattSayar

5

शुरू कर दिया सभी आकृति और आकारों के HTML के साथ काम के लिए मैं HTMLAgility पैक @http://www.codeplex.com/htmlagilitypack यह आप नोड्स के खिलाफ XPaths लिखने की सुविधा देता है आप चाहते हैं का उपयोग करें और उन पाने के लिए पसंद करते हैं एक संग्रह में वापसी।

+0

+1 भयानक पैकेज से आसान है! यह वास्तव में मेरे जीवन को बहुत आसान बना दिया! –

45

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

HtmlDocument yourDoc = // load your HTML; 
int someCount = yourDoc.DocumentNode.SelectNodes("your_xpath").Count; 
+1

और इसका उपयोग करना वास्तव में आसान है। –

+0

वाह, यह अद्भुत है ... :) मैं एक HTML पार्सर लिखने जा रहा था ... लेकिन अब मुझे अब ऐसा करने की ज़रूरत नहीं है ... आपको बहुत धन्यवाद –

2

यदि संभव हो तो पहिया को फिर से खोजना हमेशा बेहतर होता है। कुछ अच्छी उपकरण मौजूद है कि या तो अच्छी तरह से गठित XML, या कार्य करने के लिए HTML कन्वर्ट एक XmlReader के रूप में:

यहाँ तीन अच्छा साधन:

  1. TagSoup, एक खुला स्रोत कार्यक्रम, एक जावा और SAX है आधारित उपकरण, John Cowan द्वारा विकसित किया गया। यह जावा में लिखा गया एक एसएक्स-अनुपालन पार्सर है, जो अच्छी तरह से गठित या वैध एक्सएमएल को पार्स करने के बजाय, जंगली में पाए जाने वाले HTML को पार्स करता है: गरीब, बुरा और क्रूर, हालांकि अक्सर बहुत कम से कम। टैग्सपॉप उन लोगों के लिए डिज़ाइन किया गया है जिन्हें तर्कसंगत एप्लिकेशन डिज़ाइन के कुछ समानता का उपयोग करके इस सामग्री को संसाधित करना है। एक SAX इंटरफ़ेस प्रदान करके, यह मानक XML उपकरण को सबसे खराब HTML पर भी लागू करने की अनुमति देता है। टैग सूप में एक कमांड लाइन प्रोसेसर भी शामिल है जो एचटीएमएल फाइलें पढ़ता है और या तो स्वच्छ एचटीएमएल या अच्छी तरह से गठित एक्सएमएल उत्पन्न कर सकता है जो एक्सएचटीएमएल के करीब अनुमान है।
    Taggle टैगसोप का एक वाणिज्यिक सी ++ पोर्ट है।

  2. SgmlReader माइक्रोसॉफ्ट के Chris Lovett द्वारा विकसित एक उपकरण है।
    SgmlReader किसी भी SGML दस्तावेज़ (HTML के लिए समर्थन में निर्मित सहित) पर XmlReader API है। एक कमांड लाइन उपयोगिता भी प्रदान की जाती है जो अच्छी तरह से बनाए गए XML परिणाम का उत्पादन करती है। SgmlReader.zip

  3. एक उत्कृष्ट उपलब्धि the pure XSLT 2.0 Parser of HTMLDavid Carlisle ने लिखा है:
    स्टैंडअलोन निष्पादन योग्य और पूर्ण स्रोत कोड सहित ज़िप फ़ाइल डाउनलोड करें।

अपना कोड पढ़ना हमारे सभी के लिए एक महान सीखने का अभ्यास होगा।

वर्णन से:

"घ: htmlparse (स्ट्रिंग)
  घ: htmlparse (स्ट्रिंग, नाम स्थान, एचटीएमएल मोड)

    एक तर्क प्रपत्र के बराबर है)
    घ: htmlparse (स्ट्रिंग, 'http://ww.w3.org/1999/xhtml', सच()))

    HTML और/या XML के रूप में स्ट्रिंग कुछ इनबिल्ट heuristics करने के लिए) का उपयोग करपार्स करता है     नियंत्रण तत्वों के उद्घाटन और समापन पर निहित है।

    यह HTML DTD का पूरा ज्ञान नहीं है लेकिन
    खाली तत्वों और इकाई परिभाषाओं की पूरी सूची की पूरी सूची है। एचटीएमएल इकाइयों, और
    दशमलव और हेक्स चरित्र संदर्भ सभी स्वीकार किए जाते हैं। नोट एचटीएमएल-इकाइयों
    एचटीएमएल मोड = झूठी() के बावजूद भी पहचाने जाते हैं।

    तत्व नाम लोवरकेस कर रहे हैं (यदि एचटीएमएल मोड सच() है) और
    नाम स्थान नाम स्थान पैरामीटर (जो हो सकता है "" के द्वारा निर्दिष्ट में रखा निरूपित करने के लिए
    कोई नाम स्थान जब तक इनपुट नाम स्थान घोषणाओं explict गया है,
    जो मामले इन सम्मानित किया जाएगा में।

    विशेषता नाम लोवरकेस रहे हैं एचटीएमएल मोड = सच()
"

एक और विस्तृत विवरण here पढ़ें।

आशा है कि इससे मदद मिलेगी।

चीयर्स,

Dimitre Novatchev।

0

मैं कुछ कोड लिंक करने के बाद यहाँ है कि आप "LINQ HTML के लिए" का उपयोग करने देगा ...

Looking for C# HTML parser

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