2009-08-25 17 views
45

का हिस्सा निकालें मैं एक HTML पृष्ठ से शीर्षक निकालने के लिए एक नियमित अभिव्यक्ति चाहता हूं। वर्तमान में मेरे पास यह है:एक रेगेक्स मैच

title = re.search('<title>.*</title>', html, re.IGNORECASE).group() 
if title: 
    title = title.replace('<title>', '').replace('</title>', '') 

क्या केवल सामग्री को निकालने के लिए नियमित अभिव्यक्ति है इसलिए मुझे टैग को हटाने की आवश्यकता नहीं है?

धन्यवाद!

+2

वाह मैं एक सरल शीर्षक निकालने के लिए पूरे HTML पृष्ठ को पार्स करने के लिए बुलाए गए सभी प्रतिक्रियाओं पर विश्वास नहीं कर सकता। क्या अधिक है! – hoju

+0

प्रश्न शीर्षक यह सब कहता है - उदाहरण _happens_ को HTML होने के लिए दिया गया है, लेकिन सामान्य समस्या है ... सामान्य। – Phil

उत्तर

70

उपयोग regexp में () और अजगर में group(1), पर कब्जा कर लिया स्ट्रिंग (re.searchNone वापस आ जाएगी अगर यह परिणाम नहीं मिल रहा है पुनः प्राप्त करने के इतना डॉन ' टी group() सीधे का उपयोग करें):

title_search = re.search('<title>(.*)</title>', html, re.IGNORECASE) 

if title_search: 
    title = title_search.group(1) 
+0

यदि कोई शीर्षक नहीं मिलने पर आप कुछ भी नहीं कर रहे हैं, तो समूह() का उपयोग करने के लिए यह एक बुरी बात क्यों होगी? (आप वैसे भी अपवाद पकड़ सकते हैं) – tonfa

+0

हाँ, लेकिन अधिकांश लोग अपवादों को भूल जाते हैं, और जब वे उन्हें रनटाइम पर देखते हैं तो वास्तव में आश्चर्यचकित होते हैं :) –

2

प्रयास करें:

title = re.search('<title>(.*)</title>', html, re.IGNORECASE).group(1) 
+0

यदि आप वास्तव में HTML पार्सिंग के लिए REGEX का उपयोग करना चाहते हैं, तो सीधे समूह पर .group() चलाएं, क्योंकि यह कोई भी वापस नहीं लौटा सकता है। – iElectric

+0

आपको '। *?' का उपयोग करना चाहिए ताकि दस्तावेज़ में एकाधिक '' हो (संभावना नहीं है लेकिन आप कभी नहीं जानते)। – tonfa

+0

@iElectric: यदि आप वास्तव में चाहते हैं तो आप ब्लॉक को छोड़कर इसे एक कोशिश में डाल सकते हैं, है ना? – tonfa

2

re.search('<title>(.*)</title>', s, re.IGNORECASE).group(1)

4

कब्जा समूहों का उपयोग का प्रयास करें:

title = re.search('<title>(.*)</title>', html, re.IGNORECASE).group(1) 
25

कृपया, regex का उपयोग नहीं करते मार्कअप भाषाओं पार्स करने के लिए। एलएक्सएमएल या सुंदरसप का प्रयोग करें।

+29

यह उपयोग के मामले पर निर्भर करता है, कभी-कभी एक त्वरित और गंदा समाधान वांछनीय है (विशेष रूप से यदि आप हर तरह के संभावित इनपुट को संभालना नहीं चाहते हैं)। – tonfa

+3

एचटीएमएल लिखने में 2 मिनट लगते हैं कि वे रेगेक्स विफल हो जाएंगे या बैकट्रैक होंगे और इस तरह सीपीयू चक्र खाएंगे। – iElectric

+3

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

2

एचटीएमएल को पार्स करने के लिए नियमित अभिव्यक्तियों का उपयोग करना आम तौर पर एक अच्छा विचार नहीं है। आप इसके लिए सुंदर सूप जैसे किसी भी HTML पार्सर का उपयोग कर सकते हैं। http://www.crummy.com/software/BeautifulSoup/documentation.html

यह भी याद रखें कि कुछ लोगों को, जब किसी समस्या का सामना करना पड़ता है, तो "मुझे पता है, मैं नियमित अभिव्यक्तियों का उपयोग करूंगा।" अब उन्हें दो समस्याएं हैं।

-1

मैं लगता है कि यह पर्याप्त होना चाहिए: "। पाठ"

#!python 
import re 
pattern = re.compile(r'<title>([^<]*)</title>', re.MULTILINE|re.IGNORECASE) 
pattern.search(text) 

... यह सोचते हैं कि अपने पाठ (एचटीएमएल) नाम के एक चर में है

यह भी मानता है कि अन्य HTML टैग नहीं हैं जिन्हें एक HTML TITLE टैग के अंदर कानूनी रूप से एम्बेड किया जा सकता है और किसी भी कंटेनर/ब्लॉक के भीतर किसी अन्य < चरित्र को कानूनी रूप से एम्बेड करने का कोई तरीका नहीं है।

हालांकि ...

अजगर में HTML पार्स के लिए रेगुलर एक्सप्रेशन का उपयोग न करें। एक HTML पार्सर का प्रयोग करें! (आप एक पूर्ण पार्सर, जो अतिरिक्त काम का एक होगा जब विभिन्न एचटीएमएल, एसजीएमएल और एक्सएमएल पारसर्स मानक पुस्तकालयों में पहले से ही कर रहे हैं लिखने के लिए जा रहे हैं जब तक।

यदि आपका हैंडलिंग "वास्तविक दुनिया" टैग सूप एचटीएमएल । (जो अक्सर है गैर-अनुरूप किसी भी SGML/सत्यापनकर्ता करने के लिए) तो BeautifulSoup पैकेज का उपयोग यह मानक पुस्तकालयों (अभी तक) में नहीं है, लेकिन विस्तृत इस उद्देश्य के लिए सिफारिश की है

एक अन्य विकल्प है:। lxml .. जो कि उचित रूप से संरचित (मानकों अनुरूप) एचटीएमएल के लिए लिखा गया है। लेकिन इसमें सुंदरसप का उपयोग पार्सर के रूप में करने का विकल्प है: ElementSoup

1

क्या मैं आपको सुंदर सूप की सलाह दे सकता हूं।सूप आपके सभी एचटीएमएल दस्तावेज़ को पार्स करने के लिए एक बहुत अच्छा lib है। कोड की

soup = BeatifulSoup(html_doc) 
titleName = soup.title.name 
+0

मैं जोड़ना चाहता हूं, वह सुंदरसप अपूर्ण एचटीएमएल भी पार्स करता है, और यह वास्तव में अच्छा है। – pyeleven

2

प्रदान की टुकड़े सामना नहीं Exceptions साथ मेरा सुझाव मई

getattr(re.search(r"<title>(.*)</title>", s, re.IGNORECASE), 'groups', lambda:[u""])()[0] 

यह डिफ़ॉल्ट रूप से एक रिक्त स्ट्रिंग लौटाता है यदि पैटर्न नहीं पाया गया है, या पहला मैच है।

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