2008-09-25 29 views
5

मुझे एक रेगेक्स चाहिए जो एक HTML स्रोत पृष्ठ में सशर्त टिप्पणियों से मेल खा सकता है, इसलिए मैं केवल उन्हीं को हटा सकता हूं। मैं नियमित टिप्पणियों को संरक्षित करना चाहता हूं।सशर्त टिप्पणियों को हटाने के लिए Regex

मैं भी * * का उपयोग करने से बचना चाहूंगा। यदि संभव हो तो नोटेशन।

पाठ

foo 

<!--[if IE]> 

<style type="text/css"> 

ul.menu ul li{ 
    font-size: 10px; 
    font-weight:normal; 
    padding-top:0px; 
} 

</style> 

<![endif]--> 

bar 

है और मैं में <!--[if IE]> और <![endif]-->

संपादित सब कुछ निकालना चाहते हैं: यह इसलिए क्योंकि BeautifulSoup की मैं इन टैग निकालना चाहते हैं। सुंदर सूप पार्स करने में विफल रहता है और एक अधूरा स्रोत देता है

EDIT2: [यदि आईई] एकमात्र शर्त नहीं है। बहुत कुछ हैं और मेरे पास सभी संभावित संयोजनों की कोई सूची नहीं है।

EDIT3: विंको वर्सालोविक का समाधान काम करता है, लेकिन सशर्त टिप्पणी के भीतर एक दुष्ट टिप्पणी के कारण सुंदर समस्या क्यों विफल हुई थी। जैसा

<!--[if lt IE 7.]> 
<script defer type="text/javascript" src="pngfix_253168.js"></script><!--png fix for IE--> 
<![endif]--> 

सूचना <!--png fix for IE--> टिप्पणी?

हालांकि मेरी समस्या हल हो गई थी, मुझे इसके लिए रेगेक्स समाधान प्राप्त करना अच्छा लगेगा।

+0

बिना। *? कोई भी नहीं है, खासकर यदि आप सभी संभावित संयोजनों को नहीं जानते हैं, तो आप उन्हें बिना किसी * के समान कैसे पकड़ेंगे? और एक से अधिक सशर्त टिप्पणी होने पर गैर-लालची संशोधक की आवश्यकता है ... –

+0

@ विंको वर्सालोविक: आप रोकने के लिए एक लुकहेड मिलान कर सकते हैं। *? उपयोग: http://www.regular-expressions.info/lookaround.html – Huppie

+0

आप गैर लालची से क्यों बचना चाहते हैं। *? निर्माण? –

उत्तर

0

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

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

+0

कड़ाई से बोलने वाली टिप्पणियां एचटीएमएल नहीं हैं लेकिन एक एम्बेडेड मैक्रो भाषा है, जिसे AFAIK को घोंसला नहीं दिया जा सकता है। तो एक regex काम कर सकता है। – JacquesB

1

@Benoit

छोटे सुधार (पर बहु ​​के साथ बदल गया):

"<!--\[if IE\]>.*?<!\[endif\]-->" 
+0

क्या आपने पढ़ा था "यदि संभव हो तो मैं। *? नोटेशन का उपयोग करने से बचना चाहूंगा। " भाग? – Huppie

0

यह दृश्य स्टूडियो 2005, जहां कोई लाइन काल विकल्प नहीं है में काम करता है:

\<!--\[if IE\]\>{.|\n}*\<!\[endif\]--\>

5
>>> from BeautifulSoup import BeautifulSoup, Comment 
>>> html = '<html><!--[if IE]> bloo blee<![endif]--></html>' 
>>> soup = BeautifulSoup(html) 
>>> comments = soup.findAll(text=lambda text:isinstance(text, Comment) 
       and text.find('if') != -1) #This is one line, of course 
>>> [comment.extract() for comment in comments] 
[u'[if IE]> bloo blee<![endif]'] 
>>> print soup.prettify() 
<html> 
</html> 
>>>  

पायथन 3 बीएफ 4:

के साथ
from bs4 import BeautifulSoup, Comment 
html = '<html><!--[if IE]> bloo blee<![endif]--></html>' 
soup = BeautifulSoup(html, "html.parser") 
comments = soup.findAll(text=lambda text:isinstance(text, Comment) 
       and text.find('if') != -1) #This is one line, of course 
[comment.extract() for comment in comments] 
[u'[if IE]> bloo blee<![endif]'] 
print (soup.prettify()) 

यदि आपका डेटा सुंदर सूप उलझन में आता है, तो आप fix इसे अन्य समाधानों के साथ हाथ से पार्सर से पहले कर सकते हैं।

संपादित करें: अपनी टिप्पणी के अनुसार, तुम सिर्फ लैम्ब्डा findAll के लिए पारित रूप में आप की जरूरत को संशोधित (मैं इसे संशोधित)

+0

यह सहायक था, लेकिन मैं सभी टिप्पणी टैग खोना नहीं चाहता हूं। केवल सशर्त सीएसएस टिप्पणियां। – cnu

+0

इसने मुझे बहुत मदद की! धन्यवाद – sleeplessnerd

2

यहाँ आप क्या आवश्यकता होगी:

<!(|--)\[[^\]]+\]>.+?<!\[endif\](|--)> 

यह सभी प्रकार को फ़िल्टर कर देगा

<!--[if anything]> 
    ... 
<[endif]--> 

और

<![if ! IE 6]> 
    ... 
<![endif]> 
: शामिल करने की सशर्त टिप्पणियाँ

EDIT3: Vinko Vrsalovic के समाधान काम करता है, लेकिन वास्तविक समस्या क्यों BeautifulSoup में विफल रहा है सशर्त टिप्पणी के भीतर एक दुष्ट टिप्पणी की वजह से था। जैसा

सूचना टिप्पणी?

हालांकि मेरी समस्या हल हो गई थी, मुझे इसके लिए रेगेक्स समाधान प्राप्त करना अच्छा लगेगा।

कैसे इस बारे में:

(<!(|--)\[[^\]]+\]>.*?)(<!--.+?-->)(.*?<!\[endif\](|--)>) 

एक कि नियमित रूप से स्थानापन्न के रूप में \ 1 \ 4 (या $ 1 $ 4) छोड़ने अभिव्यक्ति पर की जगह मत करो।
मुझे पता है कि यह है। *? और +? इसमें, इस पोस्ट पर मेरी टिप्पणी देखें।

+0

दुख की बात है कि मैं बचने में सक्षम नहीं था। +? वाक्यविन्यास हालांकि ... – Huppie

+0

आप से बच सकते हैं। +? एक आगे संदर्भ करके वाक्यविन्यास लेकिन मेरे पास सटीक वाक्यविन्यास के लिए मेरे साथ मेरी रेगेक्स पुस्तक नहीं है: पी – Huppie

1

मैं बस के साथ जाना चाहते हैं:

import re 

html = """fjlk<wb>dsqfjqdsmlkf fdsijfmldsqjfl fjdslmfkqsjf<---- fdjslmjkqfs---><!--[if lt IE 7.]>\ 
<script defer type="text/javascript" src="pngfix_253168.js"></script><!--png fix for IE-->\ 
<![endif]-->fjlk<wb>dsqfjqdsmlkf fdsijfmldsqjfl fjdslmfkqsjf<---- fdjslmjkqfs--->""" 

# here the black magic occurs (whithout '.') 
clean_html = ''.join(re.split(r'<!--\[[^¤]+?endif]-->', html)) 

print clean_html 

'fjlk<wb>dsqfjqdsmlkf fdsijfmldsqjfl fjdslmfkqsjf<---- fdjslmjkqfs--->fjlk<wb>dsqfjqdsmlkf fdsijfmldsqjfl fjdslmfkqsjf<---- fdjslmjkqfs--->' 

N.B: [^ ¤] किसी भी वर्ण है कि '¤' नहीं है से मेल खाएगी। यह वास्तव में उपयोगी है क्योंकि यह बिजली तेज है और यह चार किसी भी कीबोर्ड पर पाया जा सकता है। लेकिन यह चाल है कि टाइप करना वाकई मुश्किल है (कोई भी इसे गलती से टाइप नहीं करेगा) और कोई इसका उपयोग नहीं करता है: यह एक सामान्य धन है जो चार बनाता है।

आप उपयोग कर ¤, हालांकि, आप chr का उपयोग (7) "प्रणाली घंटी" चार उत्पन्न करने के लिए कर सकते हैं की तरह महसूस नहीं करते हैं, जो गंदा है और एक वेब पेज ;-)

में नहीं पाया जा सकता
+2

कभी नॉर्वे के बारे में सुना है? http://en.wikipedia.org/wiki/Sm%C3%B8rrebr%C3%B8d – Gregor

+1

टाइपो को नोट करने के लिए धन्यवाद। उदारता से मेरा मतलब था ¤, जेनेरिक मुद्रा चिह्न, और नहीं, जो एक आम पत्र है। –

1

जैसा कि मैंने इसे देखा है, आपको केवल डाउनलवे-छुपा टिप्पणियां (जो <!-- से शुरू होती हैं) के बारे में चिंता करने की आवश्यकता है, और आपको if शब्द और उसके बाद की जगह से परे कुछ भी मिलान करने की आवश्यकता नहीं है। यह आप क्या चाहते हैं करना चाहिए:

"<!--\[if\s(?:[^<]+|<(?!!\[endif\]-->))*<!\[endif\]-->" 

बीच में है कि गंदगी .*? उपयोग करने के लिए नहीं अपनी इच्छा को पूरा करने के लिए है, लेकिन मैं वास्तव में यह प्रयास के लायक है नहीं लगता। .*? दृष्टिकोण ठीक काम करना चाहिए यदि आप Re.Sx को रेग सेट के साथ संकलित करते हैं या इसे (?s:...) में लपेटें। उदाहरण के लिए:

"(?s:<!--\[if\s.*?<!\[endif\]-->)" 
संबंधित मुद्दे