2010-06-04 18 views
6

मैं एक HTML पृष्ठ लेना चाहता हूं और बस उस पृष्ठ पर शुद्ध पाठ निकालने के लिए देख रहा हूँ। किसी को भी अजगर में ऐसा करने का एक अच्छा तरीका पता है?सब कुछ तोड़ने का सर्वोत्तम तरीका लेकिन वेबपृष्ठ से टेक्स्ट?

मैं सचमुच सबकुछ बाहर करना चाहता हूं और केवल लेखों के पाठ के साथ रहना चाहता हूं और टैग के बीच कभी भी अन्य पाठ क्या है। जेएस, सीएसएस, आदि ...

धन्यवाद!

उत्तर

3

प्रति here है: "। फिर मॉड्यूल आदेश नियमित अभिव्यक्ति का उपयोग करने के आयातित किए जाने की आवश्यकता"

def remove_html_tags(data): 
    p = re.compile(r'<.*?>') 
    return p.sub('', data) 

वह लेख में नोट के रूप में,

+0

भेड़ियों वाला हैं इस एक के लिए आप मिलता है। – jathanism

+0

हाँ, आम तौर पर मैं एचटीएमएल को पार्स करने के लिए नियमित अभिव्यक्तियों के उपयोग के खिलाफ हूं, लेकिन यह एक साधारण पर्याप्त दृष्टिकोण की तरह लगता है। –

+0

लेकिन निश्चित रूप से यह कोड उदाहरण भी स्ट्रिप करेगा ... यदि कोई है ... बस एक विचार :) –

5

यहां पहला जवाब सीएसएस या जावास्क्रिप्ट टैग के शरीर को हटा नहीं देता है यदि वे पृष्ठ में हैं (लिंक नहीं)। यह करीब हो सकता है:

def stripTags(text): 
    scripts = re.compile(r'<script.*?/script>') 
    css = re.compile(r'<style.*?/style>') 
    tags = re.compile(r'<.*?>') 

    text = scripts.sub('', text) 
    text = css.sub('', text) 
    text = tags.sub('', text) 

    return text 
2

lxml.html मॉड्यूल पर विचार करने लायक है। हालांकि, यह CSS और JavaScript दूर करने के लिए मालिश का एक सा लेता है:

def stripsource(page): 
    from lxml import html 

    source = html.fromstring(page) 
    for item in source.xpath("//style|//script|//comment()"): 
     item.getparent().remove(item) 

    for line in source.itertext(): 
     if line.strip(): 
      yield line 

झुकेंगे लाइनों बस concatenated जा सकती है, लेकिन अगर वहाँ खाली स्थान के पैदा पास कोई श्वेत रिक्ति नहीं है कि महत्वपूर्ण शब्द सीमाओं खो सकते हैं, टैग।

आप अपनी आवश्यकताओं के आधार पर केवल <body> टैग पर फिर से शुरू करना चाहेंगे।

4

आप बल्कि उत्कृष्ट Beautiful Soup

f = open("my_source.html","r") 
s = f.read() 
f.close() 
soup = BeautifulSoup.BeautifulSoup(s) 
txt = soup.body.getText() 

की कोशिश कर सकते लेकिन चेतावनी दी: क्या आप किसी भी पार्स प्रयास से वापस पाने की गलतियों 'के अधीन किया जाएगा। खराब एचटीएमएल, खराब पार्सिंग और केवल सामान्य अप्रत्याशित आउटपुट। यदि आपके स्रोत दस्तावेजों को अच्छी तरह से जाना जाता है और अच्छी तरह से प्रस्तुत किया जाता है तो आपको ठीक होना चाहिए, या उनमें से कम से कम idiosyncrasies के आसपास काम करने में सक्षम होना चाहिए, लेकिन अगर यह सामान्य इंटरनेट "इंटरनेट पर बाहर" पाया जाता है तो सभी प्रकार के अजीब और अद्भुत आउटलेटर्स की अपेक्षा करें।

+0

मैंने सुंदर सूप का उपयोग करने की कोशिश की लेकिन खराब एचटीएमएल के कारण इसे अपवादित करने का एक उच्च प्रतिशत जो कोई बुनो नहीं है – James

2

मैं भी BeautifulSoup की सिफारिश करेंगे, लेकिन मैं this question के जवाब पर की तरह कुछ का उपयोग कर जो मैं यहाँ जो लोग वहाँ देखने के लिए नहीं करना चाहते हैं के लिए कॉपी कर देंगे सिफारिश करेंगे:

soup = BeautifulSoup.BeautifulSoup(html) 
texts = soup.findAll(text=True) 

def visible(element): 
    if element.parent.name in ['style', 'script', '[document]', 'head', 'title']: 
     return False 
    elif re.match('<!--.*-->', str(element)): 
     return False 
    return True 

visible_texts = filter(visible, texts) 

मैं इस पर कोशिश की उदाहरण के लिए यह पृष्ठ और यह काफी अच्छा काम किया।

1

यह साफ और आसान समाधान मैं पट्टी सीएसएस पाया था और जावास्क्रिप्ट:

''.join(BeautifulSoup(content).findAll(text=lambda text: 
text.parent.name != "script" and 
text.parent.name != "style")) 

https://stackoverflow.com/a/3002599/1203188 द्वारा Matthew Flaschen

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