2009-06-08 9 views

उत्तर

0

आप के साथ HTMLParser मॉड्यूल (जटिल) यह कर सकते हैं या रेगुलर एक्सप्रेशन का उपयोग:

import re 
content = "asdf <script> bla </script> end" 
x=re.search("<script>.*?</script>", content, re.DOTALL) 
span = x.span() # gives (5, 27) 

stripped_content = content[:span[0]] + content[span[1]:] 

संपादित करें: re.DOTALL, धन्यवाद tgray को

+4

इस मामले में जैसी चीजों के बारे में संभावित मुद्दों के बहुत सारे है, चाहे स्क्रिप्ट टैग गुण होते हैं, संभवतः पाठ, आदि के टुकड़े यह मज़बूती से सभी विकल्पों को कवर करने के लिए यह बहुत आसान मौजूदा उपयोग करने के लिए कर रही है बहुत मुश्किल है भाग निकले , सुंदर सूप जैसे परीक्षण, पुस्तकालयों। – mavnn

+0

तुम इतनी 'डॉट' चरित्र नई-पंक्तियों से मेल खाता है अपनी खोज के re.DOTALL/re.S झंडा जोड़ सकते हैं। इसके बिना, आप स्क्रिप्ट ब्लॉक से मेल नहीं खाएंगे जो कई लाइनों (जो उनमें से अधिकतर हैं) का विस्तार करते हैं। – tgray

+0

दुर्भाग्यपूर्ण है कि एक वैध उत्तर मतदान हो जाता है; यह निश्चित रूप से आवश्यक चश्मे को पूरा करता है। क्या यह –

-1

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

25

आप इस (और अन्य) के साथ BeautifulSoup उपयोग कर सकते हैं तरीके:

soup = BeautifulSoup(source.lower()) 
to_extract = soup.findAll('script') 
for item in to_extract: 
    item.extract() 

यह वास्तव में HTML से नोड्स निकाल देता है। यदि आप खाली <script></script> टैग छोड़ना चाहते हैं तो आपको सूप से निकालने के बजाय item विशेषताओं के साथ काम करना होगा।

+6

यह सही जवाब है। निलोय, या कोई भी इस प्रश्न को पढ़ने वाले, कृपया इस मामले में नियमित अभिव्यक्तियों का उपयोग करने के लिए वकालत करने वाले किसी भी उत्तर को अनदेखा करें क्योंकि उनके पास _serious_ है, आसानी से शोषण योग्य सुरक्षा समस्याएं हैं। –

+0

मैं @DrJokepu से सहमत हूं। नियमित अभिव्यक्तियों के साथ एचटीएमएल पार्स करने की कोशिश मत करो! वर str = "

-1
example_text = "This is some text <script> blah blah blah </script> this is some more text." 

import re 
myre = re.compile("(^.*)<script>(.*)</script>(.*$)") 
result = myre.match(example_text) 
result.groups() 
    <52> ('This is some text ', ' blah blah blah ', ' this is some more text.') 

# Text between <script> .. </script> 
result.group(2) 
    <56> 'blah blah blah' 

# Text outside of <script> .. </script> 
result.group(1)+result.group(3) 
    <57> 'This is some text this is some more text.' 
+3

ध्यान दें कि (। * $)") के माध्यम से फिसल जाएगा पकड़ लो। –

-1

आप किसी भी मॉड्यूल का आयात करने के लिए नहीं करना चाहते हैं:

string = "<script> this is some js. begone! </script>" 

string = string.split(' ') 

for i, s in enumerate(string): 
    if s == '<script>' or s == '</script>' : 
     del string[i] 

print ' '.join(string) 
+2

फिर से, lol'; आदि? –

+1

खैर, वह कहा ""। – sqram

0

जवाब PEV और wr द्वारा पोस्ट की गई के अनुसार, क्यों एक रेगुलर एक्सप्रेशन के उन्नयन के लिए नहीं, जैसे:

pattern = r"(?is)<script[^>]*>(.*?)</script>" 
text = """<script>foo bar 
baz bar foo </script>""" 
re.sub(pattern, '', text) 

(? है) - मामले को अनदेखा करने और पाठ में नई लाइनों को अनुमति देने के लिए जोड़ा गया। इस संस्करण को विशेषताओं के साथ स्क्रिप्ट टैग का भी समर्थन करना चाहिए।

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

BTW मैं एक गलती की है, कोड इस तरह दिखना चाहिए:

pattern = r"(?is)(<script[^>]*>)(.*?)(</script>)" 
text = """<script>foo bar 
baz bar foo </script>""" 
re.sub(pattern, '\1\3', text) 
+3

ipt>/* बुराई स्क्रिप्ट यहां आती है */? इस मामले में नियमित अभिव्यक्तियों का उपयोग करना मेरी राय में सिर्फ सादा गलत है। रास्ता बहुत आसान है। –

5

आप XSS रोकने का प्रयास कर रहे हैं? बस <script> टैग को खत्म करने से सभी संभावित हमलों को हल नहीं किया जाएगा! यहां कई तरीकों की एक महान सूची दी गई है (उनमें से कुछ बहुत रचनात्मक) कि आप http://ha.ckers.org/xss.html कमजोर हो सकते हैं। इस पृष्ठ को पढ़ने के बाद आपको समझना चाहिए कि नियमित अभिव्यक्ति का उपयोग करके <script> टैग को समाप्त करना क्यों पर्याप्त मजबूत नहीं है। पायथन लाइब्रेरी lxml में ऐसा फ़ंक्शन है जो आपके HTML को दृढ़ता से साफ करने के लिए इसे सुरक्षित बनाएगा।

तो आप यह सुनिश्चित करें कि आप सिर्फ <script> टैग को खत्म करना चाहते हैं lxml में इस कोड को काम करना चाहिए रहे हैं:

from lxml.html import parse 

root = parse(filename_or_url).getroot() 
for element in root.iter("script"): 
    element.drop_tree() 

नोट: मैं नियमित expresions का उपयोग करके सभी समाधान downvoted। यहाँ देखें क्यों आप नियमित अभिव्यक्ति का उपयोग करके HTML पार्स नहीं करना चाहिए: Using regular expressions to parse HTML: why not?

नोट 2: एक और एसओ दिखा सवाल एचटीएमएल कि नियमित अभिव्यक्ति के साथ पार्स करने के लिए असंभव है: Can you provide some examples of why it is hard to parse XML and HTML with a regex?

0

Element Tree सबसे अच्छा सरल और मधुर पैकेज है यह करने के लिए। हां, इसे करने के अन्य तरीके भी हैं; लेकिन किसी भी 'coz वे चूसना का उपयोग न करें! (मार्क तीर्थ के माध्यम से)

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