2009-05-11 10 views
6

पर विचार लगता है:अजगर - - Regex कैसे तार के दो सेट के बीच एक स्ट्रिंग निम्नलिखित

<div id=hotlinklist> 
    <a href="foo1.com">Foo1</a> 
    <div id=hotlink> 
    <a href="/">Home</a> 
    </div> 
    <div id=hotlink> 
    <a href="/extract">Extract</a> 
    </div> 
    <div id=hotlink> 
    <a href="/sitemap">Sitemap</a> 
    </div> 
</div> 

कैसे आप अजगर में regex के साथ साइटमैप लाइन बाहर लेने के बारे में जाना होगा?

<a href="/sitemap">Sitemap</a> 

एंकर टैग खींचने के लिए निम्नलिखित का उपयोग किया जा सकता है।

'/<a(.*?)a>/i' 

हालांकि, कई एंकर टैग हैं। इसके अलावा कई हॉटलिंक भी हैं इसलिए हम वास्तव में उनका उपयोग नहीं कर सकते हैं?

+0

आप शायद सुनेंगे कि नियमित अभिव्यक्ति उपयुक्त नहीं हैं एक विषय से मुक्त पार्स करने के लिए एचटीएमएल की तरह भाषा। – Gumbo

+2

यदि आप उस HTML को उत्पन्न कर रहे हैं, तो यह ध्यान देने योग्य है कि एकाधिक, समान 'id = 'विशेषताएं मान्य नहीं हैं। एक 'वर्ग =' अधिक उपयुक्त है। –

उत्तर

13

रेगेक्स का उपयोग न करें। BeautfulSoup, एक HTML पार्सर का प्रयोग करें।

from BeautifulSoup import BeautifulSoup 

html = \ 
""" 
<div id=hotlinklist> 
    <a href="foo1.com">Foo1</a> 
    <div id=hotlink> 
    <a href="/">Home</a> 
    </div> 
    <div id=hotlink> 
    <a href="/extract">Extract</a> 
    </div> 
    <div id=hotlink> 
    <a href="/sitemap">Sitemap</a> 
    </div> 
</div>""" 

soup = BeautifulSoup(html) 
soup.findAll("div",id="hotlink")[2].a 

# <a href="/sitemap">Sitemap</a> 
6

नियमित अभिव्यक्ति के साथ HTML को पार्स करना एक बुरा विचार है!

एचटीएमएल

का निम्न भाग के बारे में सोचो वहाँ ऐसे कई उदाहरण हैं। नियमित अभिव्यक्ति कई चीजों के लिए अच्छी होती है, लेकिन HTML को पार्स करने के लिए नहीं।

आपको Beautiful Soup पायथन एचटीएमएल पार्सर का उपयोग करने पर विचार करना चाहिए।

>>> e.findall(data) 
['<a href="foo1.com">Foo1</a>', '<a href="/">Home</a>', '<a href="/extract">Extract</a>', '<a href="/sitemap">Sitemap</a>'] 
+0

यदि आप उस '। *' को '(?: [^ <] + | <(!/A \ b) के साथ प्रतिस्थापित करते हैं) * ', आपको बैकट्रैकिंग के साथ रेगेक्स इंजन को उड़ाने के बिना कम झूठी सकारात्मक चीज़ें मिलेंगी। –

1

उपयोग BeautifulSoup या lxml यदि आप HTML पार्स करने के लिए की जरूरत है:

किसी भी तरह, एक तदर्थ regex का उपयोग कर समाधान

import re 

data = """ 
<div id=hotlinklist> 
    <a href="foo1.com">Foo1</a> 
    <div id=hotlink> 
    <a href="/">Home</a> 
    </div> 
    <div id=hotlink> 
    <a href="/extract">Extract</a> 
    </div> 
    <div id=hotlink> 
    <a href="/sitemap">Sitemap</a> 
    </div> 
</div> 
""" 

e = re.compile('<a *[^>]*>.*</a *>') 

print e.findall(data) 

आउटपुट है।

इसके अलावा, आपको वास्तव में क्या करना है? अंतिम लिंक खोजें? तीसरा लिंक खोजें? लिंक/साइटमैप को इंगित करने वाला लिंक ढूंढें? यह आपके सवाल से अस्पष्ट है। डेटा के साथ पर आपको क्या करना है?

यदि आपको वास्तव में नियमित अभिव्यक्तियों का उपयोग करना है, तो findall पर एक नज़र डालें।

5

आदेश टैगलाइन की सामग्री को निकालने के लिए में:

<a href="/sitemap">Sitemap</a> 

... मैं का प्रयोग करेंगे:

>>> import re 
    >>> s = ''' 
    <div id=hotlinklist> 
    <a href="foo1.com">Foo1</a> 
     <div id=hotlink> 
     <a href="/">Home</a> 
     </div> 
     <div id=hotlink> 
     <a href="/extract">Extract</a> 
     </div> 
     <div id=hotlink> 
     <a href="/sitemap">Sitemap</a> 
     </div> 
    </div>''' 
    >>> m = re.compile(r'<a href="/sitemap">(.*?)</a>').search(s) 
    >>> m.group(1) 
    'Sitemap' 
+0

वास्तव में, XYZ के साथ साइटमैप को प्रतिस्थापित करें क्योंकि यह वास्तव में कुछ भी हो सकता है। मुझे केवल इतना पता होगा कि यह हॉटलिनलिस्ट div के भीतर तीसरा div है। उपयोग किए गए HTML पैटर्न को कई बार दोहराया जा सकता है। मान लें कि मैं eBay पर सूचीबद्ध सभी स्मार्ट फोन लेना चाहता हूं। मुझे पता चलेगा कि उपरोक्त पैटर्न प्रत्येक स्मार्ट फोन के लिए दोहराया गया है, हालांकि, XYZ एक आईफोन, ब्लैकबेरी, नोकिया या कोई अन्य स्मार्ट फोन हो सकता है। कोई आइटम या 100 नहीं हो सकता है। तो, मैं कुछ ऐसा ढूंढ रहा था जो दोहराया पैटर्न ढूंढता है, फिर स्मार्ट फोन लाइन ले लो और स्मार्ट फोन की एक सूची लें। – un33k

+0

मुझे यह पसंद है क्योंकि यह सवाल का जवाब देता है। यह मुझे रेगेक्स को बेहतर समझने में भी मदद करता है या नहीं। – Max

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