2012-12-10 20 views
5

के लिए पाइथन नियमित अभिव्यक्ति मैं विशिष्ट div टैग खींचने के लिए सुंदर सूप का उपयोग कर रहा हूं, और ऐसा लगता है कि मैं सरल स्ट्रिंग मिलान का उपयोग नहीं कर सकता।सुंदर सूप

पेज

<div class="comment comment-xxxx..."> 

के रूप में

<div class="comment form new"...> 

का रूप है जो मैं अनदेखा करना चाहते में कुछ टैग, और भी कुछ टैग जहां एक्स की मनमानी लंबाई के एक पूर्णांक का प्रतिनिधित्व करते हैं , और अंडाकार सफेद रिक्त स्थान से अलग अन्य मूल्यों की मनमानी संख्या का प्रतिनिधित्व करता है (जिसे मैं चिंतित नहीं करता)। मैं सही रेगेक्स अभिव्यक्ति को नहीं समझ सकता, खासकर जब से मैंने कभी भी पाइथन की कक्षा का उपयोग नहीं किया है।

soup.find_all(class_="comment") 

का उपयोग करते हुए सभी टैग शब्द टिप्पणी के साथ शुरू पाता है। मैं

soup.find_all(class_=re.compile(r'(comment)()(comment)')) 
soup.find_all(class_=re.compile(r'comment comment.*')) 

और अन्य रूपों के बहुत सारे उपयोग करने की कोशिश की है, लेकिन मुझे लगता है कि मैं कुछ के बारे में कैसे regex अभिव्यक्ति या मैच() काम यहाँ स्पष्ट याद कर रहा हूँ। क्या कोई मेरी मदद कर सकता है?

+1

सबसे पहले, क्या आप बीएस 3, या बीएस 4 का उपयोग कर रहे हैं? किसी को 'findAll' है, किसी के पास 'find_all' है, न तो' findall' है ... – abarnert

+0

क्षमा करें, बीएस 4 - मैंने सीधे अपने कोड से पेस्ट नहीं किया है, संपादित करेंगे। – user1890572

+0

अरे, क्योंकि मेरे पास बीएस 3 का जवाब था ... लेकिन बीएस 4 के लिए, ऐसा लगता है कि यह कक्षाओं में रिक्त स्थान पसंद नहीं करता है? या शायद मैं बस बीएस 4 को पर्याप्त नहीं जानता। मैं 'टिप्पणी' से मेल खा सकता हूं, लेकिन 'टिप्पणी टिप्पणी' नहीं। मैं इस पर गौर करूंगा। – abarnert

उत्तर

15

मुझे लगता है कि मुझे मिल गया:

>>> [div['class'] for div in soup.find_all('div')] 
[['comment', 'form', 'new'], ['comment', 'comment-xxxx...']] 

ध्यान दें कि, BS3 में बराबर के विपरीत, यह नहीं यह है:

['comment form new', 'comment comment-xxxx...'] 

और यही कारण है अपने regexps मेल नहीं खाएगी।

लेकिन आप मिलान कर सकते हैं, उदाहरण के लिए, इस:

>>> soup.find_all('div', class_=re.compile('comment-')) 
[<div class="comment comment-xxxx..."></div>] 

ध्यान दें कि बी एस ताकि आप 'comment-.*' जरूरत नहीं है, re.search, नहीं re.match के बराबर है। बेशक अगर आप 'comment-12345' से मेल खाना चाहते हैं लेकिन 'comment-of-another-kind नहीं चाहते हैं, उदाहरण के लिए, 'comment-\d+'

+0

मुझे बीएस 4 दस्तावेज में इसके बारे में कुछ पढ़ना याद है, लेकिन यह अभी भी counterintuitive है। बहुत बहुत धन्यवाद! मैंने एक घंटे के लिए इसके खिलाफ अपने सिर को हराया +। – user1890572

+0

@ user1890572: मुझे यकीन नहीं है कि क्यों, लेकिन मैंने अभी भी बीएस 4 डॉक्स के माध्यम से एक त्वरित तृतीय-पक्ष "बीएस 3 से माइग्रेट करने" गाइड से परे नहीं पढ़ा है, इसलिए मुझे इस तरह की समस्याओं के माध्यम से परेशान करने के लिए उपयोग किया गया है कोड। बस सोचो, अगर मैं चालाक था, तो मैं जवाब देने में सक्षम नहीं होता। :) – abarnert

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