रेगेक्स मैच का हिस्सा निकालें


130

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

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

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


5
वाह, मैं एक साधारण शीर्षक निकालने के लिए पूरे HTML पृष्ठ को पार्स करने के लिए कॉल करने वाली सभी प्रतिक्रियाओं पर विश्वास नहीं कर सकता। क्या ओवरकिल!
होजू २0

4
प्रश्न शीर्षक यह सब कहते हैं - उदाहरण के दिया होता एचटीएमएल होने के लिए है, लेकिन सामान्य समस्या सामान्य है ...।
फिल

जवाबों:


207

कैप्चर किए गए स्ट्रिंग को पुनः प्राप्त करने के लिए ( )regexp और group(1)python में उपयोग करें ( यदि यह परिणाम नहीं मिलता है, तो re.searchवापस आ जाएगा None, इसलिए सीधे संपर्क न करेंgroup() ):

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

if title_search:
    title = title_search.group(1)

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

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

चलाने के लिए मत भूलना import reवरना आपको मिलेगाNameError: name 're' is not defined
Powers

16

ध्यान दें कि शुरू करना Python 3.8, और असाइनमेंट एक्सप्रेशन (PEP 572) ( :=ऑपरेटर) की शुरूआत , यह संभव है कि क्रेज़िस्टोफ़ो कसासो के समाधान पर थोड़ा सुधार कर मैच परिणाम को सीधे एक कैप्चर किया जा सके, यदि वैरिएबल के रूप में कंडीशन में है और इसे कंडीशन बॉडी में री- यूज़ करें। :

# pattern = '<title>(.*)</title>'
# text = '<title>hello</title>'
if match := re.search(pattern, text, re.IGNORECASE):
  title = match.group(1)
# hello



4

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

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

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

3

प्रयत्न:

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

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

यदि आप दस्तावेज़ में .*?कई हैं </title>(यदि आप कभी भी नहीं जानते हैं) तो आपको इसका उपयोग करना चाहिए ।
टोनफा

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

3

प्रदान किए गए कोड के टुकड़े Exceptions मई के साथ सामना नहीं करते हैं मैं सुझाव देता हूं

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

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


1

मुझे लगता है कि यह पर्याप्त होना चाहिए:

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

... यह मानते हुए कि आपका पाठ (HTML) "पाठ" नामक एक चर में है।

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

हालांकि ...

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

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

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

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.