পাইথন ব্যবহার করে এইচটিএমএল ফাইল থেকে পাঠ্য আহরণ করা হচ্ছে


243

আমি পাইথন ব্যবহার করে একটি HTML ফাইল থেকে পাঠ্যটি বের করতে চাই ract আমি মূলত একই আউটপুটটি পেতে চাই যদি আমি কোনও ব্রাউজার থেকে পাঠ্যটি অনুলিপি করে নোটপ্যাডে আটকান।

আমি নিয়মিত ভাব প্রকাশের চেয়ে আরও শক্তিশালী কিছু চাই যা খারাপভাবে গঠিত এইচটিএমএলে ব্যর্থ হতে পারে। আমি অনেক লোককে বিউটিফুল স্যুপের সুপারিশ করতে দেখেছি, তবে এটি ব্যবহার করতে আমার কিছু সমস্যা হয়েছে। একটির জন্য, এটি জাভাস্ক্রিপ্ট উত্সের মতো অযাচিত পাঠ্যগুলি তুলেছে। এছাড়াও, এটি এইচটিএমএল সত্ত্বার ব্যাখ্যা দেয় না। উদাহরণস্বরূপ, আমি প্রত্যাশা করব & # 39; এইচটিএমএল উত্সে পাঠ্যের কোনও অ্যাডাস্ট্রোফিতে রূপান্তরিত করতে, ঠিক যেমন আমি ব্রাউজারের সামগ্রীটি নোটপ্যাডে পেস্ট করেছি।

আপডেট html2text আশাব্যঞ্জক মনে হচ্ছে। এটি HTML সত্তা সঠিকভাবে পরিচালনা করে এবং জাভাস্ক্রিপ্ট উপেক্ষা করে। যাইহোক, এটি ঠিক প্লেইন পাঠ্য উত্পাদন করে না; এটি মার্কডাউন উত্পন্ন করে যা তারপরে সরল পাঠ্যে পরিণত করতে হবে। এটি কোনও উদাহরণ বা ডকুমেন্টেশন সহ আসে না তবে কোডটি পরিষ্কার দেখায়।


সম্পর্কিত প্রশ্নগুলি:


কিছুক্ষণের জন্য, লোকেরা আমার এনএলটিকে উত্তরটি (বেশ সাম্প্রতিক) অত্যন্ত দরকারী বলে মনে করছে যাতে আপনি গৃহীত উত্তরটি পরিবর্তন করার বিষয়টি বিবেচনা করতে পারেন। ধন্যবাদ!
শাতু

1
আমি কখনই ভাবিনি যে আমি আমার প্রিয় ব্লগের লেখক দ্বারা জিজ্ঞাসিত একটি প্রশ্নটি উপস্থিত করব! প্রচেষ্টা!
রায়ান জি

1
@ শাতু এখন আপনার সমাধানটি আর বৈধ হয়ে উঠেনি, আপনি আপনার মন্তব্য মুছতে পারেন। ধন্যবাদ! ;)
Sнаđошƒаӽ

উত্তর:


136

এইচটিএমএল 2 টেক্সট একটি পাইথন প্রোগ্রাম যা এতে খুব সুন্দর কাজ করে।


5
বিট এটি
জিপিএল 3.0.০

138
অ্যামেজিং! এর লেখক হলেন আরআইপি অ্যারন সোয়ার্টজ।
অতুল অরবিন্দ

2
জিপিএল ৩.০ এর কারণে কেউ এইচটিএমএল টেক্সটের কোনও বিকল্প খুঁজে পেয়েছে?
জন্টসাই

1
জিপিএল যতটা খারাপ মানুষ চায় তা নয় bad হারুন ভাল জানত।
স্টিভ কে

2
আমি html2text এবং nltk উভয়ই চেষ্টা করেছিলাম কিন্তু তারা আমার পক্ষে কাজ করেনি। আমি বিউটিফুল স্যুপ 4 দিয়ে চলেছি, যা সুন্দরভাবে কাজ করে (কোনও পাং উদ্দেশ্যে নয়)।
রায়ান 18

150

জাভাস্ক্রিপ্ট না পেয়ে বা জিনিসগুলি না পেয়ে পাঠ্য উত্তোলনের জন্য আমি খুঁজে পেয়েছি সেরাতম কোড:

import urllib
from bs4 import BeautifulSoup

url = "http://news.bbc.co.uk/2/hi/health/2284783.stm"
html = urllib.urlopen(url).read()
soup = BeautifulSoup(html)

# kill all script and style elements
for script in soup(["script", "style"]):
    script.extract()    # rip it out

# get text
text = soup.get_text()

# break into lines and remove leading and trailing space on each
lines = (line.strip() for line in text.splitlines())
# break multi-headlines into a line each
chunks = (phrase.strip() for line in lines for phrase in line.split("  "))
# drop blank lines
text = '\n'.join(chunk for chunk in chunks if chunk)

print(text)

আপনাকে এর আগে কেবল বিউটিফুলসপ ইনস্টল করতে হবে:

pip install beautifulsoup4

2
আমরা যদি কিছু লাইন নির্বাচন করতে চাই, স্রেফ বলেছেন, লাইন # 3?
হেপিডাড

3
হত্যার স্ক্রিপ্টস বিট, ত্রাণকর্তা !!
নন্দ

2
প্রচুর স্ট্যাকওভারফ্লো উত্তর দেওয়ার পরেও আমার কাছে মনে হচ্ছে এটি আমার পক্ষে সেরা বিকল্প। আমার একটি সমস্যার মুখোমুখি হ'ল লাইনগুলি কিছু ক্ষেত্রে একসাথে যুক্ত হয়েছিল। আমি get_text ফাংশনে পৃথককারী যোগ করে এটি কাটিয়ে উঠতে সক্ষম হয়েছি:text = soup.get_text(separator=' ')
জোসউইন কেজে

5
soup.get_text()আমি পরিবর্তে ব্যবহার করেছি soup.body.get_text(), যাতে আমি <head> উপাদান থেকে কোনও পাঠ্য না পাই যেমন শিরোনাম।
সুজার্ড

10
পাইথন 3 এর জন্যfrom urllib.request import urlopen
জ্যাকব কালাল জোসেফ

99

দ্রষ্টব্য: এনটিএলকে আর clean_htmlফাংশন সমর্থন করে না

নীচে আসল উত্তর, এবং মন্তব্য বিভাগে একটি বিকল্প।


এনএলটিকে ব্যবহার করুন

এইচটিএমএল 2 টেক্সট দিয়ে সমস্যাগুলি সমাধান করতে আমি আমার 4-5 ঘন্টা নষ্ট করি। ভাগ্যক্রমে আমি এনএলটিকের মুখোমুখি হতে পারি।
এটি ম্যাজিকভাবে কাজ করে।

import nltk   
from urllib import urlopen

url = "http://news.bbc.co.uk/2/hi/health/2284783.stm"    
html = urlopen(url).read()    
raw = nltk.clean_html(html)  
print(raw)

8
কখনও কখনও এটি যথেষ্ট হয় :)
শর্মিলা

8
আমি এটি হাজার বার ভোট দিতে চাই। আমি রেগেক্স নরকে আটকে ছিলাম, তবে দেখ, এখন আমি এনএলটিকের প্রজ্ঞা দেখছি।
বেনডুন্ডি

26
স্পষ্টতই, ক্লিন_এইচটিএমএল আর সমর্থিত নয়: github.com/nltk/nltk/commit/…
আলেকজান্ডারলুকানিন

5
এত সাধারণ কাজের জন্য এনল্টকের মতো ভারী গ্রন্থাগার আমদানি করা খুব বেশি হবে
richie

54
@ অ্যালেক্সান্ডারলুকানিন 13 উত্স থেকে:raise NotImplementedError ("To remove HTML markup, use BeautifulSoup's get_text() function")
ক্রিস অ্যারিনা

54

নিজেকে আজ একই সমস্যার মুখোমুখি হতে পেরেছি। আমি সমস্ত মার্কআপগুলির আগত সামগ্রীগুলি ছাঁটাইতে খুব সাধারণ এইচটিএমএল পার্সার লিখেছিলাম, কেবলমাত্র সর্বনিম্ন বিন্যাসে রেখে বাকি পাঠ্যটি ফিরিয়ে আছি।

from HTMLParser import HTMLParser
from re import sub
from sys import stderr
from traceback import print_exc

class _DeHTMLParser(HTMLParser):
    def __init__(self):
        HTMLParser.__init__(self)
        self.__text = []

    def handle_data(self, data):
        text = data.strip()
        if len(text) > 0:
            text = sub('[ \t\r\n]+', ' ', text)
            self.__text.append(text + ' ')

    def handle_starttag(self, tag, attrs):
        if tag == 'p':
            self.__text.append('\n\n')
        elif tag == 'br':
            self.__text.append('\n')

    def handle_startendtag(self, tag, attrs):
        if tag == 'br':
            self.__text.append('\n\n')

    def text(self):
        return ''.join(self.__text).strip()


def dehtml(text):
    try:
        parser = _DeHTMLParser()
        parser.feed(text)
        parser.close()
        return parser.text()
    except:
        print_exc(file=stderr)
        return text


def main():
    text = r'''
        <html>
            <body>
                <b>Project:</b> DeHTML<br>
                <b>Description</b>:<br>
                This small script is intended to allow conversion from HTML markup to 
                plain text.
            </body>
        </html>
    '''
    print(dehtml(text))


if __name__ == '__main__':
    main()

5
পাইথনের (২.7) এটি কেবলমাত্র ডিফল্ট মডিউলগুলি ব্যবহার করে করার সবচেয়ে সহজ উপায় বলে মনে হয়। যা সত্যিই নির্বোধ, কারণ এটি একটি সাধারণভাবে প্রয়োজনীয় জিনিস এবং এটির জন্য ডিফল্ট এইচটিএমএল পার্সার মডিউলে কোনও পার্সার নেই কেন তার কোনও সঠিক কারণ নেই।
ইঙ্গমার হুপ

2
আমার মনে হয় না এইচটিএমএল অক্ষরগুলি ইউনিকোডে রূপান্তরিত হবে, তাইনা? উদাহরণস্বরূপ , ডান &amp;রূপান্তরিত হবে না &?
স্পিড প্লেন

পাইথন 3 ব্যবহারের জন্যfrom html.parser import HTMLParser
শেবাজে

14

এখানে এক্স্পেরোনির উত্তরের একটি সংস্করণ যা কিছুটা সম্পূর্ণ more এটি স্ক্রিপ্ট এবং স্টাইল বিভাগগুলি এড়িয়ে যায় এবং চেরেফগুলি (যেমন, & # 39;) এবং এইচটিএমএল সত্তা (যেমন, & amp;) অনুবাদ করে।

এটিতে একটি তুচ্ছ প্লেইন-পাঠ্য থেকে এইচটিএমএল বিপরীত রূপান্তরকারীও অন্তর্ভুক্ত।

"""
HTML <-> text conversions.
"""
from HTMLParser import HTMLParser, HTMLParseError
from htmlentitydefs import name2codepoint
import re

class _HTMLToText(HTMLParser):
    def __init__(self):
        HTMLParser.__init__(self)
        self._buf = []
        self.hide_output = False

    def handle_starttag(self, tag, attrs):
        if tag in ('p', 'br') and not self.hide_output:
            self._buf.append('\n')
        elif tag in ('script', 'style'):
            self.hide_output = True

    def handle_startendtag(self, tag, attrs):
        if tag == 'br':
            self._buf.append('\n')

    def handle_endtag(self, tag):
        if tag == 'p':
            self._buf.append('\n')
        elif tag in ('script', 'style'):
            self.hide_output = False

    def handle_data(self, text):
        if text and not self.hide_output:
            self._buf.append(re.sub(r'\s+', ' ', text))

    def handle_entityref(self, name):
        if name in name2codepoint and not self.hide_output:
            c = unichr(name2codepoint[name])
            self._buf.append(c)

    def handle_charref(self, name):
        if not self.hide_output:
            n = int(name[1:], 16) if name.startswith('x') else int(name)
            self._buf.append(unichr(n))

    def get_text(self):
        return re.sub(r' +', ' ', ''.join(self._buf))

def html_to_text(html):
    """
    Given a piece of HTML, return the plain text it contains.
    This handles entities and char refs, but not javascript and stylesheets.
    """
    parser = _HTMLToText()
    try:
        parser.feed(html)
        parser.close()
    except HTMLParseError:
        pass
    return parser.get_text()

def text_to_html(text):
    """
    Convert the given text to html, wrapping what looks like URLs with <a> tags,
    converting newlines to <br> tags and converting confusing chars into html
    entities.
    """
    def f(mo):
        t = mo.group()
        if len(t) == 1:
            return {'&':'&amp;', "'":'&#39;', '"':'&quot;', '<':'&lt;', '>':'&gt;'}.get(t)
        return '<a href="%s">%s</a>' % (t, t)
    return re.sub(r'https?://[^] ()"\';]+|[&\'"<>]', f, text)


Get_text এ, '' .জয়েন হওয়া উচিত ''। একটি খালি জায়গা থাকতে হবে, অন্যথায় কিছু পাঠ্য একসাথে যোগদান করবে।
ওবিনা ন্নানন্যা

1
এছাড়াও, আপনি সমস্ত পাঠ্য ধারক ট্যাগ যেমন এইচ 1, এইচ 2, স্প্যান ইত্যাদি অন্তর্ভুক্ত ব্যতীত এটি সমস্ত পাঠ্যকে ধরতে পারে না better
ওবিনা ন্নানন্যা

11

আমি জানি ইতিমধ্যে উত্তর অনেক আছে, কিন্তু অধিকাংশ elegent এবং pythonic সমাধান আমি খুঁজে পেয়েছি বর্ণনা করা হয়েছে, আংশিকভাবে, এখানে

from bs4 import BeautifulSoup

text = ''.join(BeautifulSoup(some_html_string, "html.parser").findAll(text=True))

হালনাগাদ

ফ্রেজারের মন্তব্যের ভিত্তিতে, এখানে আরও মার্জিত সমাধান রয়েছে:

from bs4 import BeautifulSoup

clean_text = ''.join(BeautifulSoup(some_html_string, "html.parser").stripped_strings)

2
কোনও সতর্কতা এড়াতে, বিউটিফুলসপ ব্যবহারের জন্য একটি পার্সার নির্দিষ্ট করুন:text = ''.join(BeautifulSoup(some_html_string, "lxml").findAll(text=True))
ফ্লয়েড

অতিরিক্ত সাদা স্থান এড়াতে আপনি স্ট্রিপড_স্ট্রিংস জেনারেটরটি ব্যবহার করতে পারেন - যেমনclean_text = ''.join(BeautifulSoup(some_html_string, "html.parser").stripped_strings
ফ্রেজার

8

আপনি স্ট্রিপোগ্রাম লাইব্রেরিতেও html2text পদ্ধতি ব্যবহার করতে পারেন।

from stripogram import html2text
text = html2text(your_html_string)

স্ট্রিপোগ্রাম ইনস্টল করতে সুডো ইজি_সনস্টল স্ট্রিপোগ্রামটি চালান


23
এই মডিউলটির পাইপী পৃষ্ঠা অনুসারে অবনতি হয়েছে: "আপনি যদি এই প্যাকেজটি ব্যবহার করার কোনও historical তিহাসিক কারণ না দেখেন তবে আমি এর বিরুদ্ধে পরামর্শ দেব!"
intuited

7

ডেটা মাইনিংয়ের জন্য প্যাটার্ন লাইব্রেরি রয়েছে।

http://www.clips.ua.ac.be/pages/pattern-web

আপনি কী ট্যাগ রাখতে হবে তা সিদ্ধান্ত নিতে পারেন:

s = URL('http://www.clips.ua.ac.be').download()
s = plaintext(s, keep={'h1':[], 'h2':[], 'strong':[], 'a':['href']})
print s

6

পাইপারসিং একটি দুর্দান্ত কাজ করে। পাইপার্সিং উইকিকে হত্যা করা হয়েছিল তাই এখানে আরেকটি অবস্থান রয়েছে যেখানে পাইপাসিং ব্যবহারের উদাহরণ রয়েছে ( উদাহরণ লিঙ্ক )। পাইপার্সিংয়ের সাথে অল্প সময় বিনিয়োগের একটি কারণ হ'ল তিনি খুব সংক্ষেপে খুব সুসংহত ও'রিলি শর্ট কাট ম্যানুয়ালও লিখেছেন যা ব্যয়বহুলও।

এটি বলার পরেও, আমি বিউটিফুলসুপটি প্রচুর ব্যবহার করি এবং সত্তা সম্পর্কিত সমস্যাগুলি মোকাবেলা করা এতটা কঠিন নয়, আপনি বিউটিফুলসুপ চালানোর আগে আপনি এগুলিকে রূপান্তর করতে পারেন।

গুডলাক


1
লিঙ্কটি মারা গেছে বা উত্সাহিত।
ইয়ভেটে

4

এটি ঠিক একটি পাইথন সমাধান নয়, তবে এটি জাভাস্ক্রিপ্টটিকে পাঠ্যে রূপান্তর করবে যা আমি মনে করি গুরুত্বপূর্ণ (EG google.com)। ব্রাউজার লিঙ্কগুলিতে (লিংক নয়) একটি জাভাস্ক্রিপ্ট ইঞ্জিন রয়েছে এবং এটি উত্সকে -ডাম্প বিকল্পের সাহায্যে পাঠ্যে রূপান্তর করবে।

সুতরাং আপনি যেমন কিছু করতে পারে:

fname = os.tmpnam()
fname.write(html_source)
proc = subprocess.Popen(['links', '-dump', fname], 
                        stdout=subprocess.PIPE,
                        stderr=open('/dev/null','w'))
text = proc.stdout.read()

4

এইচটিএমএল পার্সার মডিউলটির পরিবর্তে, htmllib দেখুন। এটির অনুরূপ ইন্টারফেস রয়েছে তবে এটি আপনার জন্য আরও কাজ করে। (এটি বেশ প্রাচীন, তাই এটি জাভাস্ক্রিপ্ট এবং সিএসএস থেকে মুক্তি পাওয়ার ক্ষেত্রে খুব বেশি সহায়তা করে না You আপনি একটি উদ্ভূত শ্রেণি তৈরি করতে পারেন তবে স্টার্ট_স্ক্রিপ্ট এবং শেষ_ স্টাইলের মতো নাম যুক্ত পদ্ধতি যুক্ত করতে পারেন (বিশদটির জন্য পাইথন ডক্স দেখুন)) তবে এটি শক্ত এটি বিকৃত এইচটিএমএল জন্য নির্ভরযোগ্যভাবে করতে।) যাইহোক, এখানে সাধারণ কিছু যা কনসোলটিতে সরল পাঠ্যকে মুদ্রণ করে

from htmllib import HTMLParser, HTMLParseError
from formatter import AbstractFormatter, DumbWriter
p = HTMLParser(AbstractFormatter(DumbWriter()))
try: p.feed('hello<br>there'); p.close() #calling close is not usually needed, but let's play it safe
except HTMLParseError: print ':(' #the html is badly malformed (or you found a bug)

এনবি: এইচটিএমএলরার এবং এইচটিএমএলপার্সেরর উভয়ই এইচটিএমএলপ্রেসিয়ার পড়তে হবে। এটি কাজ করে তবে লাইন ব্রেকগুলি বজায় রাখার একটি খারাপ কাজ করে।
ডেভ নাইট

4

আমি গুজ-এক্সট্র্যাক্টর গোস নামক একটি পাইথন প্যাকেজটির পরামর্শ দিচ্ছি নীচের তথ্যগুলি বের করার চেষ্টা করবে:

একটি নিবন্ধের মূল পাঠ্য নিবন্ধের মূল চিত্র কোনও ইউটিউব / ভিমেও চলচ্চিত্র নিবন্ধে এম্বেড করা হয়েছে মেটা বিবরণ মেটা ট্যাগগুলি

আরও: https://pypi.python.org/pypi/goose-extractor/


4

আপনার যদি আরও গতি এবং কম নির্ভুলতার প্রয়োজন হয় তবে আপনি কাঁচা lxML ব্যবহার করতে পারেন।

import lxml.html as lh
from lxml.html.clean import clean_html

def lxml_to_text(html):
    doc = lh.fromstring(html)
    doc = clean_html(doc)
    return doc.text_content()

4

html2text ব্যবহার করে ইনস্টল করুন

পিপ ইনস্টল html2text

তারপর,

>>> import html2text
>>>
>>> h = html2text.HTML2Text()
>>> # Ignore converting links from HTML
>>> h.ignore_links = True
>>> print h.handle("<p>Hello, <a href='http://earth.google.com/'>world</a>!")
Hello, world!

4

আমি জানি এখানে ইতিমধ্যে প্রচুর উত্তর রয়েছে তবে আমি মনে করি সংবাদপত্র 3 ক এর একটি উল্লেখও প্রাপ্য। ওয়েবে নিবন্ধগুলি থেকে পাঠ্য আহরণের একই ধরণের কাজটি আমার সম্প্রতি শেষ করতে হবে এবং এই পরীক্ষাগুলি আমার পরীক্ষাগুলিতে এ পর্যন্ত এটি অর্জনের একটি দুর্দান্ত কাজ করেছে। এটি মেনু আইটেম এবং সাইড বারগুলিতে পাওয়া পাঠ্য পাশাপাশি যে কোনও জাভাস্ক্রিপ্ট ওপি অনুরোধ হিসাবে পৃষ্ঠাতে প্রদর্শিত হবে তা উপেক্ষা করে।

from newspaper import Article

article = Article(url)
article.download()
article.parse()
article.text

আপনার যদি ইতিমধ্যে এইচটিএমএল ফাইলগুলি ডাউনলোড করা থাকে তবে আপনি এরকম কিছু করতে পারেন:

article = Article('')
article.set_html(html)
article.parse()
article.text

এমনকি নিবন্ধের বিষয়গুলির সংক্ষিপ্তসার জন্য এটিতে কয়েকটি এনএলপি বৈশিষ্ট্য রয়েছে:

article.nlp()
article.summary

3

সুন্দর স্যুপ এইচটিএমএল সত্তাকে রূপান্তরিত করে। এইচটিএমএল বিবেচনা করার জন্য এটি সম্ভবত আপনার সেরা বেটটি প্রায়শই বগিযুক্ত এবং ইউনিকোড এবং এইচটিএমএল এনকোডিংয়ের সমস্যায় ভরা থাকে। এইচটিএমএলকে কাঁচা পাঠ্যে রূপান্তর করতে আমি এই কোডটি ব্যবহার করি:

import BeautifulSoup
def getsoup(data, to_unicode=False):
    data = data.replace("&nbsp;", " ")
    # Fixes for bad markup I've seen in the wild.  Remove if not applicable.
    masssage_bad_comments = [
        (re.compile('<!-([^-])'), lambda match: '<!--' + match.group(1)),
        (re.compile('<!WWWAnswer T[=\w\d\s]*>'), lambda match: '<!--' + match.group(0) + '-->'),
    ]
    myNewMassage = copy.copy(BeautifulSoup.BeautifulSoup.MARKUP_MASSAGE)
    myNewMassage.extend(masssage_bad_comments)
    return BeautifulSoup.BeautifulSoup(data, markupMassage=myNewMassage,
        convertEntities=BeautifulSoup.BeautifulSoup.ALL_ENTITIES 
                    if to_unicode else None)

remove_html = lambda c: getsoup(c, to_unicode=True).getText(separator=u' ') if c else ""

3

অন্য বিকল্প হ'ল একটি পাঠ্য ভিত্তিক ওয়েব ব্রাউজারের মাধ্যমে এইচটিএমএল চালানো এবং এটি ডাম্প করা। উদাহরণস্বরূপ (লিংক ব্যবহার করে):

lynx -dump html_to_convert.html > converted_html.txt

এটি অজগর স্ক্রিপ্টের মধ্যে নিম্নলিখিত হিসাবে করা যেতে পারে:

import subprocess

with open('converted_html.txt', 'w') as outputFile:
    subprocess.call(['lynx', '-dump', 'html_to_convert.html'], stdout=testFile)

এটি আপনাকে এইচটিএমএল ফাইল থেকে ঠিক পাঠ্য দেবে না, তবে আপনার ব্যবহারের ক্ষেত্রে নির্ভর করে এটি এইচটিএমএল 2 টেক্সটের আউটপুট তুলনায় পছন্দনীয় হতে পারে।


3

আমার পক্ষে সেরা কাজ হ'ল লিপি।

https://github.com/weblyzard/inscriptis

import urllib.request
from inscriptis import get_text

url = "http://www.informationscience.ch"
html = urllib.request.urlopen(url).read().decode('utf-8')

text = get_text(html)
print(text)

ফলাফল সত্যিই ভাল


2

আর একটি অ পাইথন সমাধান: লিব্রে অফিস:

soffice --headless --invisible --convert-to txt input1.html

অন্যান্য বিকল্পগুলির তুলনায় আমি এটিকে পছন্দ করার কারণটি হ'ল প্রতিটি এইচটিএমএল অনুচ্ছেদটি একটি একক পাঠ্য লাইনে রূপান্তরিত হয় (কোনও লাইন ব্রেক হয় না), যা আমি খুঁজছিলাম। অন্যান্য পদ্ধতিতে পোস্ট-প্রসেসিং প্রয়োজন। লিঙ্কস ভাল আউটপুট উত্পাদন করে, তবে ঠিক আমি যা খুঁজছিলাম তা নয়। এছাড়াও, Libre Office সমস্ত ধরণের ফর্ম্যাট থেকে রূপান্তর করতে ব্যবহার করা যেতে পারে ...


2

কেউ ব্লিচbleach.clean(html,tags=[],strip=True) দিয়ে চেষ্টা করেছেন ? এটা আমার জন্য কাজ করছে।


আমার জন্যও কাজ করে বলে মনে হচ্ছে, তবে তারা এই উদ্দেশ্যে এটি ব্যবহার করার পরামর্শ দিচ্ছে না: "এই ফাংশনটি একটি সুরক্ষিত-কেন্দ্রিক ফাংশন, যার একমাত্র উদ্দেশ্য একটি স্ট্রিং থেকে দূষিত সামগ্রীগুলি মুছে ফেলা যেমন এটি কোনও ওয়েবের সামগ্রী হিসাবে প্রদর্শিত হতে পারে is পৃষ্ঠা। " -> bleach.readthedocs.io/en/latest/clean.html#bleach.clean
লোকটোপাস

2

অ্যাপাচি টিকার সাথে আমার ভাল ফলাফল হয়েছে । এর উদ্দেশ্য হ'ল মেটাডেটা এবং সামগ্রী থেকে পাঠ্যের উত্তোলন, অতএব অন্তর্নিহিত পার্সারটি সেই অনুযায়ী বাক্সের বাইরে সুর করা।

টিকা সার্ভার হিসাবে চালানো যায় , ডকারের ধারকটিতে চালানো / মোতায়েনের জন্য তুচ্ছ, এবং সেখান থেকে পাইথন বাইন্ডিংগুলির মাধ্যমে অ্যাক্সেস করা যায় ।


1

একটি সহজ উপায়ে

import re

html_text = open('html_file.html').read()
text_filtered = re.sub(r'<(.*?)>', '', html_text)

এই কোডটি html_text এর সমস্ত অংশ '<' দিয়ে শুরু হয়ে '>' দিয়ে শেষ করে এবং খালি স্ট্রিংয়ের মাধ্যমে পাওয়া সমস্তগুলি প্রতিস্থাপন করে


1

বিউটিফুলসুপ ব্যবহার করে শৈলী এবং স্ক্রিপ্ট সামগ্রী মুছে ফেলার জন্য পিয়োটিআইএল এর উত্তর আমার পক্ষে কার্যকর হয়নি। আমি এর decomposeপরিবর্তে এটি ব্যবহার করে চেষ্টা করেছি extractতবে এটি এখনও কার্যকর হয়নি। সুতরাং আমি নিজের তৈরি করেছি যা <p>ট্যাগ ব্যবহার করে পাঠ্যকেও ফর্ম্যাট করে এবং ট্যাগটি <a>href লিঙ্কের সাথে প্রতিস্থাপন করে । পাঠ্যের ভিতরে লিঙ্কগুলি সহ অনুলিপি করুন। এম্বেড করা পরীক্ষার ডক সহ এই টুকরোটিতে উপলব্ধ ।

from bs4 import BeautifulSoup, NavigableString

def html_to_text(html):
    "Creates a formatted text email message as a string from a rendered html template (page)"
    soup = BeautifulSoup(html, 'html.parser')
    # Ignore anything in head
    body, text = soup.body, []
    for element in body.descendants:
        # We use type and not isinstance since comments, cdata, etc are subclasses that we don't want
        if type(element) == NavigableString:
            # We use the assumption that other tags can't be inside a script or style
            if element.parent.name in ('script', 'style'):
                continue

            # remove any multiple and leading/trailing whitespace
            string = ' '.join(element.string.split())
            if string:
                if element.parent.name == 'a':
                    a_tag = element.parent
                    # replace link text with the link
                    string = a_tag['href']
                    # concatenate with any non-empty immediately previous string
                    if (    type(a_tag.previous_sibling) == NavigableString and
                            a_tag.previous_sibling.string.strip() ):
                        text[-1] = text[-1] + ' ' + string
                        continue
                elif element.previous_sibling and element.previous_sibling.name == 'a':
                    text[-1] = text[-1] + ' ' + string
                    continue
                elif element.parent.name == 'p':
                    # Add extra paragraph formatting newline
                    string = '\n' + string
                text += [string]
    doc = '\n'.join(text)
    return doc

1
ধন্যবাদ, এই উত্তরটি আন্ডাররেটেড। আমাদের মধ্যে যারা একটি পরিষ্কার পাঠ্য উপস্থাপনা রাখতে চান যা ব্রাউজারের মতো আচরণ করে (নিউলাইনগুলি উপেক্ষা করে, এবং কেবল অনুচ্ছেদ এবং লাইন বিরতি বিবেচনায় নিয়ে আসে), বিউটিফুলস্প get_textকেবল এটিকে কাটেনি।
জেরিয়াল

@ জরিল খুশী যে আপনি এটি কার্যকর পেয়েছেন, অবদানের জন্য ধন্যবাদ। অন্য কারও জন্য, সংযুক্ত সংক্ষেপটি কিছুটা বাড়ানো হয়েছে। ওপিকে যা বোঝায় তা হ'ল এমন একটি সরঞ্জাম যা লিঙ্কের মতো অনেকগুলি পাঠ্য ভিত্তিক ব্রাউজারের মতো, এইচটিএমএল পাঠ্যকে দেয়। এই সমাধান চেষ্টা করে যা। বেশিরভাগ লোকেরা যা অবদান রাখছে তা হ'ল কেবল পাঠ্য উত্তোলক।
রেসিটআপ

1

পাইথন 3.x এ আপনি 'ইমামপ্লিব' এবং 'ইমেল' প্যাকেজগুলি আমদানি করে খুব সহজ উপায়ে এটি করতে পারেন। যদিও এটি একটি পুরানো পোস্ট তবে সম্ভবত আমার উত্তর এই পোস্টে নতুন আগতদের সহায়তা করতে পারে।

status, data = self.imap.fetch(num, '(RFC822)')
email_msg = email.message_from_bytes(data[0][1]) 
#email.message_from_string(data[0][1])

#If message is multi part we only want the text version of the body, this walks the message and gets the body.

if email_msg.is_multipart():
    for part in email_msg.walk():       
        if part.get_content_type() == "text/plain":
            body = part.get_payload(decode=True) #to control automatic email-style MIME decoding (e.g., Base64, uuencode, quoted-printable)
            body = body.decode()
        elif part.get_content_type() == "text/html":
            continue

এখন আপনি বডি ভেরিয়েবল মুদ্রণ করতে পারেন এবং এটি প্লেইন টেক্সট ফর্ম্যাটে হবে :) এটি যদি আপনার পক্ষে যথেষ্ট ভাল হয় তবে এটি গ্রহণযোগ্য উত্তর হিসাবে নির্বাচন করা ভাল be


এটি কিছুই রূপান্তর করে না ।
অ্যান্টি হাপালা

1
এটি আপনাকে দেখায় যে text/plainকোনও ইমেল থেকে অন্য অংশটি রাখলে কীভাবে কোনও অংশ বের করতে হয়। এটি এইচটিএমএলকে প্লেইন টেক্সটে রূপান্তর করতে কিছুই করে না, এবং আপনি কোনও ওয়েব সাইট থেকে এইচটিএমএল রূপান্তর করতে চাইলে দূর থেকে কার্যকর কিছু করে না।
ট্রিপলি

1

আপনি এইচটিএমএল থেকে বিউটিফুলসপ দিয়ে কেবল পাঠ্যই বের করতে পারবেন

url = "https://www.geeksforgeeks.org/extracting-email-addresses-using-regular-expressions-python/"
con = urlopen(url).read()
soup = BeautifulSoup(con,'html.parser')
texts = soup.get_text()
print(texts)

1

যদিও প্রচুর লোকেরা এইচটিএমএল ট্যাগ ফেলার জন্য রেজেেক্স ব্যবহার করে উল্লেখ করেছেন, সেখানে অনেকগুলি ডাউনসাইড রয়েছে।

উদাহরণ স্বরূপ:

<p>hello&nbsp;world</p>I love you

এতে বিশ্লেষণ করা উচিত:

Hello world
I love you

আমি এখানে এনেছিলাম এমন একটি স্নিপেট, আপনি এটি আপনার নির্দিষ্ট প্রয়োজনীয়তার সাথে কাস্টমাইজ করতে পারেন এবং এটি একটি কবজির মতো কাজ করে

import re
import html
def html2text(htm):
    ret = html.unescape(htm)
    ret = ret.translate({
        8209: ord('-'),
        8220: ord('"'),
        8221: ord('"'),
        160: ord(' '),
    })
    ret = re.sub(r"\s", " ", ret, flags = re.MULTILINE)
    ret = re.sub("<br>|<br />|</p>|</div>|</h\d>", "\n", ret, flags = re.IGNORECASE)
    ret = re.sub('<.*?>', ' ', ret, flags=re.DOTALL)
    ret = re.sub(r"  +", " ", ret)
    return ret

1

পাইথন ২.7.৯++ এ বিউটিফুলসৌপ 4 ব্যবহার করে অন্য একটি উদাহরণ

রয়েছে:

import urllib2
from bs4 import BeautifulSoup

কোড:

def read_website_to_text(url):
    page = urllib2.urlopen(url)
    soup = BeautifulSoup(page, 'html.parser')
    for script in soup(["script", "style"]):
        script.extract() 
    text = soup.get_text()
    lines = (line.strip() for line in text.splitlines())
    chunks = (phrase.strip() for line in lines for phrase in line.split("  "))
    text = '\n'.join(chunk for chunk in chunks if chunk)
    return str(text.encode('utf-8'))

ব্যাখ্যা:

ইউআরএল ডেটা এইচটিএমএল হিসাবে পড়ুন (বিউটিফুলসপ ব্যবহার করে), সমস্ত স্ক্রিপ্ট এবং শৈলী উপাদানগুলি সরান, এবং .get_text () ব্যবহার করে কেবল পাঠ্য পান। রেখাগুলি ভাঙ্গুন এবং প্রতিটিটির শীর্ষস্থানীয় এবং চলমান স্থানটি সরিয়ে ফেলুন, তারপরে লাইন.স্প্লিট ("") এর বাক্যাংশের জন্য লাইনের জন্য লাইনের জন্য প্রতিটি খণ্ড = (ফ্রেম.স্ট্রিপ ()) একাধিক শিরোনামকে একটি লাইনে বিভক্ত করুন। তারপরে টেক্সট = '\ n'.join ব্যবহার করে, ফাঁকা লাইন ছেড়ে দিন, অবশেষে অনুমোদিত utf-8 হিসাবে ফিরে আসুন।

মন্তব্য:

  • এটি চালু আছে এমন কয়েকটি সিস্টেম এসএসএল সমস্যার কারণে https: // সংযোগগুলির সাথে ব্যর্থ হবে, আপনি এই সমস্যাটি সমাধানের জন্য যাচাইকরণটি বন্ধ করতে পারেন। উদাহরণ ফিক্স: http://blog.pengyifan.com/how-to-fix-python-ssl-certificate_verify_failed/

  • পাইথন <2.7.9 এ চলতে কিছু সমস্যা থাকতে পারে

  • টেক্সট.ইনকোড ('utf-8') অদ্ভুত এনকোডিং ছেড়ে দিতে পারে, পরিবর্তে কেবল str (পাঠ্য) ফিরে আসতে পারে।


0

আমি নিয়মিতভাবে ব্যবহার করি কোডটি এখানে।

from bs4 import BeautifulSoup
import urllib.request


def processText(webpage):

    # EMPTY LIST TO STORE PROCESSED TEXT
    proc_text = []

    try:
        news_open = urllib.request.urlopen(webpage.group())
        news_soup = BeautifulSoup(news_open, "lxml")
        news_para = news_soup.find_all("p", text = True)

        for item in news_para:
            # SPLIT WORDS, JOIN WORDS TO REMOVE EXTRA SPACES
            para_text = (' ').join((item.text).split())

            # COMBINE LINES/PARAGRAPHS INTO A LIST
            proc_text.append(para_text)

    except urllib.error.HTTPError:
        pass

    return proc_text

আমি আশা করি এটি সাহায্য করবে.


0

অ্যাপ্লিকেশনটি পাইথন ম্যাক্রোগুলিকে নিয়োগ করতে পারে বলে লিব্রেফিস লেখকের মন্তব্যে যোগ্যতা রয়েছে। এই প্রশ্নের উত্তর দেওয়ার জন্য এবং LibreOffice এর ম্যাক্রো বেসটি আরও বাড়িয়ে তোলার জন্য উভয়ই একাধিক উপকারের প্রস্তাব বলে মনে হচ্ছে। বৃহত্তর উত্পাদন প্রোগ্রামের অংশ হিসাবে ব্যবহার না করে এই রেজোলিউশনটি যদি একতরফা বাস্তবায়ন হয় তবে লেখকটিতে এইচটিএমএল খোলার এবং পাঠ্য হিসাবে পৃষ্ঠাটি সংরক্ষণ করা এখানে আলোচিত সমস্যাগুলির সমাধান বলে মনে হয়।


0

পার্ল উপায় (দুঃখিত মা, আমি প্রযোজনায় এটি কখনই করব না)।

import re

def html2text(html):
    res = re.sub('<.*?>', ' ', html, flags=re.DOTALL | re.MULTILINE)
    res = re.sub('\n+', '\n', res)
    res = re.sub('\r+', '', res)
    res = re.sub('[\t ]+', ' ', res)
    res = re.sub('\t+', '\t', res)
    res = re.sub('(\n )+', '\n ', res)
    return res

এটি অনেক কারণে খারাপ অভ্যাস, উদাহরণস্বরূপ&nbsp;
উরি গোরেন

হ্যাঁ! এটা সত্যি! এটা কোথাও করবেন না!
brunql
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.