2009-10-23 16 views
5

मैं मनमानी HTML पृष्ठों से टेक्स्ट निकालने का प्रयास कर रहा हूं। कुछ पेज (जिन पर मेरा कोई नियंत्रण नहीं है) ने HTML या स्क्रिप्ट को विकृत किया है जो इसे कठिन बनाते हैं। इसके अलावा मैं एक साझा होस्टिंग वातावरण पर हूं, इसलिए मैं किसी भी पायथन lib को इंस्टॉल कर सकता हूं, लेकिन मैं सर्वर पर जो कुछ भी चाहता हूं उसे इंस्टॉल नहीं कर सकता।विकृत HTML पृष्ठों से पाठ निकालने के लिए पायथन रणनीति

pyparsing और html2text.py भी विकृत HTML पृष्ठों के लिए काम नहीं कर रहे थे।

# Try using BeautifulSoup 3.0.7a 
soup = BeautifulSoup.BeautifulSoup(s) 
comments = soup.findAll(text=lambda text:isinstance(text,Comment)) 
[comment.extract() for comment in comments] 
c=soup.findAll('script') 
for i in c: 
    i.extract()  
body = bsoup.body(text=True) 
text = ''.join(body) 
# if BeautifulSoup can't handle it, 
# alter html by trying to find 1st instance of "<body" and replace everything prior to that, with "<html><head></head>" 
# try beautifulsoup again with new html 

अगर BeautifulSoup अभी भी काम नहीं करता है, तो मैं 1 चार को देखने का एक अनुमानी का उपयोग कर का सहारा, पिछले चार:

उदाहरण URL http://apnews.myway.com/article/20091015/D9BB7CGG1.html

मेरे वर्तमान कार्यान्वयन लगभग है निम्नलिखित है (यह देखने के लिए कि क्या वे इसकी कोड लाइन # < की तरह दिखते हैं और लाइन का नमूना लेते हैं और फिर जांचें कि टोकन अंग्रेजी शब्द हैं या संख्याएं हैं। यदि टोकन में से कुछ शब्द या संख्या हैं, तो मुझे लगता है कि लाइन कोड है।

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

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

+0

खैर, समाधान गैर-विवाद, आपके द्वारा लिंक की गई समाचार-कहानी बहुत अच्छी पढ़ी गई थी। कुछ लोग, हुह? :) –

+1

@ लेसे, मुझे लगता है कि विकृत लोग भी हैं। – Johnny4000

उत्तर

5

हंसी की कोशिश न करें, लेकिन:

class TextFormatter: 
    def __init__(self,lynx='/usr/bin/lynx'): 
     self.lynx = lynx 

    def html2text(self, unicode_html_source): 
     "Expects unicode; returns unicode" 
     return Popen([self.lynx, 
         '-assume-charset=UTF-8', 
         '-display-charset=UTF-8', 
         '-dump', 
         '-stdin'], 
         stdin=PIPE, 
         stdout=PIPE).communicate(input=unicode_html_source.encode('utf-8'))[0].decode('utf-8') 

मुझे आशा है कि आप बनबिलाव मिल गया है!

+0

मेरे पास lynx = नहीं है (और वे इसे इंस्टॉल नहीं करेंगे। उनके पास ईलिंक्स इंस्टॉल हैं जो उन्होंने मुझे बताया है कि ऐसा ही माना जाता है। यह देखने के लिए ELinks प्रलेखन को देखकर काम करेगा। Lynx के बारे में जानना अच्छा नहीं है कम – Johnny4000

+0

ईलिंक्स और लिंक्स किक बट। मुझे उनके बारे में बताने के लिए धन्यवाद। – Johnny4000

+0

यह मेरी तरफ से निराशा से पैदा हुआ था, मैं आपको बता सकता हूं। मुझे खुशी है कि यह आपके लिए उपयोगी है! –

0

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

# remove all that crap around the body and let BS fix the tags 
newhtml = "<html><body>%s</body></html>" % (
    u''.join(unicode(tag) for tag in BeautifulSoup(oldhtml).body.contents)) 
# use html2text to turn it into text 
text = html2text(newhtml) 

और यह काम किया, लेकिन निश्चित रूप से दस्तावेज इतने खराब हो सकते थे कि बीएस भी ज्यादा बचा नहीं सकता है।

0

सुंदर सूप विकृत HTML के साथ खराब होगा। कुछ regex-fu के बारे में क्या?

>>> import re 
>>> 
>>> html = """<p>This is paragraph with a bunch of lines 
... from a news story.</p>""" 
>>> 
>>> pattern = re.compile('(?<=p>).+(?=</p)', re.DOTALL) 
>>> pattern.search(html).group() 
'This is paragraph with a bunch of lines\nfrom a news story.' 

फिर आप विधानसभा मान्य टैग की सूची, जिससे आप जानकारी निकालने के लिए चाहते हैं।

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