Chciałbym wyodrębnić tekst z pliku HTML za pomocą Pythona. Chcę zasadniczo taki sam wynik, jaki uzyskałbym, gdy skopiowałem tekst z przeglądarki i wkleiłem go do notatnika.
Chciałbym czegoś bardziej niezawodnego niż używanie wyrażeń regularnych, które mogą zawieść na źle sformatowanym HTML. Widziałem wiele osób polecających piękną zupę, ale miałem kilka problemów z jej użyciem. Po pierwsze, odebrał niechciany tekst, na przykład źródło JavaScript. Ponadto nie interpretował encji HTML. Na przykład oczekiwałbym & # 39; w źródle HTML do konwersji na apostrof w tekście, tak jak gdybym wkleił zawartość przeglądarki do notatnika.
Aktualizacja html2text
wygląda obiecująco. Obsługuje jednostki HTML poprawnie i ignoruje JavaScript. Jednak nie produkuje dokładnie zwykłego tekstu; generuje przecenę, którą należałoby przekształcić w zwykły tekst. Nie zawiera przykładów ani dokumentacji, ale kod wygląda na czysty.
Powiązane pytania:
źródło
Odpowiedzi:
html2text to program w języku Python, który robi w tym całkiem niezłą robotę.
źródło
Najlepszy kawałek kodu, jaki znalazłem do wyodrębniania tekstu bez uzyskiwania javascript lub niepotrzebnych rzeczy:
Musisz tylko zainstalować BeautifulSoup przed:
źródło
text = soup.get_text(separator=' ')
soup.get_text()
użyłemsoup.body.get_text()
, aby nie uzyskać żadnego tekstu z<head
elementu>, takiego jak tytuł.from urllib.request import urlopen
UWAGA: NTLK nie obsługuje już
clean_html
funkcjiOryginalna odpowiedź poniżej i alternatywa w sekcjach komentarzy.
Użyj NLTK
Zmarnowałem swoje 4-5 godzin na rozwiązywanie problemów z html2text. Na szczęście mogłem spotkać NLTK.
Działa magicznie.
źródło
raise NotImplementedError ("To remove HTML markup, use BeautifulSoup's get_text() function")
Znalazłem się dzisiaj w obliczu tego samego problemu. Napisałem bardzo prosty parser HTML, aby usunąć przychodzące treści ze wszystkich znaczników, zwracając pozostały tekst z minimalnym formatowaniem.
źródło
&
nie zostanie przekonwertowany na&
, prawda?from html.parser import HTMLParser
Oto wersja odpowiedzi Xperroni, która jest nieco bardziej kompletna. Pomija sekcje skryptów i stylów oraz tłumaczy charrefs (np. & # 39;) i encje HTML (np. & Amp;).
Zawiera także trywialny odwrotny konwerter zwykłego tekstu na HTML.
źródło
Wiem, że jest już wiele odpowiedzi, ale najbardziej eleganckie i pytoniczne rozwiązanie, które znalazłem, zostało częściowo opisane tutaj .
Aktualizacja
Na podstawie komentarza Frasera, oto bardziej eleganckie rozwiązanie:
źródło
text = ''.join(BeautifulSoup(some_html_string, "lxml").findAll(text=True))
clean_text = ''.join(BeautifulSoup(some_html_string, "html.parser").stripped_strings
Możesz także użyć metody html2text w bibliotece stripogramów.
Aby zainstalować stripogram, uruchom sudo easy_install stripogram
źródło
Istnieje biblioteka wzorców do eksploracji danych.
http://www.clips.ua.ac.be/pages/pattern-web
Możesz nawet zdecydować, które tagi zachować:
źródło
PyParsing wykonuje świetną robotę. Wiki PyParsing zostało zabite, więc tutaj jest inna lokalizacja, w której znajdują się przykłady użycia PyParsing ( przykładowy link ). Jednym z powodów, dla których warto poświęcić trochę czasu na pyparsowanie, jest to, że napisał również bardzo krótki, dobrze zorganizowany podręcznik O'Reilly Short Cut, który jest również niedrogi.
Powiedziawszy to, często używam BeautifulSoup i nie jest tak trudno poradzić sobie z problemami z podmiotami, możesz je przekonwertować przed uruchomieniem BeautifulSoup.
Powodzenia
źródło
To nie jest dokładnie rozwiązanie Pythona, ale przekształci tekst, który JavaScript wygeneruje w tekst, co moim zdaniem jest ważne (EG google.com). Łącza przeglądarki (nie Lynx) mają silnik Javascript i przekonwertują kod źródłowy na tekst za pomocą opcji -dump.
Więc możesz zrobić coś takiego:
źródło
Zamiast modułu HTMLParser sprawdź htmllib. Ma podobny interfejs, ale wykonuje dla ciebie więcej pracy. (Jest dość starożytny, więc nie pomaga w pozbyciu się javascript i css. Możesz stworzyć klasę pochodną, ale dodać metody o nazwach takich jak start_script i end_style (szczegóły w dokumentacji Pythona), ale jest to trudne zrobić to niezawodnie w przypadku zniekształconego html.) W każdym razie oto coś prostego, co drukuje zwykły tekst na konsoli
źródło
Polecam pakiet Python o nazwie goose-extractor Goose spróbuje wyodrębnić następujące informacje:
Główny tekst artykułu Główny obraz artykułu Wszelkie filmy z Youtube / Vimeo osadzone w artykule Meta Opis Meta tagi
Więcej: https://pypi.python.org/pypi/goose-extractor/
źródło
jeśli potrzebujesz większej prędkości i mniejszej dokładności, możesz użyć raw lxml.
źródło
zainstaluj html2text za pomocą
następnie,
źródło
Wiem, że wiele odpowiedzi tutaj już ale myślę newspaper3k również zasługuje na wzmiankę. Niedawno musiałem wykonać podobne zadanie wyodrębnienia tekstu z artykułów w Internecie, a biblioteka ta wykonała świetną robotę, osiągając to do tej pory w moich testach. Ignoruje tekst znajdujący się w elementach menu i paskach bocznych, a także w dowolnym JavaScript, który pojawia się na stronie, gdy żąda OP.
Jeśli masz już pobrane pliki HTML, możesz zrobić coś takiego:
Ma nawet kilka funkcji NLP do podsumowywania tematów artykułów:
źródło
Piękna zupa przekształca jednostki HTML. Jest to prawdopodobnie najlepszy wybór, biorąc pod uwagę, że HTML jest często błędny i pełen problemów z kodowaniem Unicode i HTML. Oto kod, którego używam do konwersji html na surowy tekst:
źródło
Inną opcją jest uruchomienie html przez przeglądarkę tekstową i zrzucenie go. Na przykład (przy użyciu Lynx):
Można to zrobić w skrypcie python w następujący sposób:
Nie da ci dokładnie tylko tekstu z pliku HTML, ale w zależności od przypadku użycia może być lepszym rozwiązaniem niż wyjście html2text.
źródło
Najlepsze dla mnie były napisy.
https://github.com/weblyzard/inscriptis
Wyniki są naprawdę dobre
źródło
Inne rozwiązanie niebędące pythonem: Libre Office:
Powodem, dla którego wolę tę niż inne alternatywy, jest to, że każdy akapit HTML jest konwertowany na jedną linię tekstu (bez podziałów linii), czego szukałem. Inne metody wymagają przetwarzania końcowego. Lynx produkuje niezłe wyniki, ale nie dokładnie to, czego szukałem. Poza tym Libre Office może być wykorzystywany do konwersji z różnych formatów ...
źródło
Czy ktoś próbował
bleach.clean(html,tags=[],strip=True)
z wybielaczem ? to działa dla mnie.źródło
Mam dobre wyniki z Apache Tika . Jego celem jest wyodrębnianie metadanych i tekstu z zawartości, dlatego bazowy analizator składni jest odpowiednio dostosowywany po wyjęciu z pudełka.
Tika może być uruchamiana jako serwer , uruchamianie / wdrażanie w kontenerze Docker jest banalne, a stamtąd można uzyskać do niej dostęp poprzez powiązania Pythona .
źródło
w prosty sposób
ten kod znajduje wszystkie części tekstu HTML zaczynające się od „<” i kończące się na „>” i zastępuje wszystkie znalezione pustym ciągiem
źródło
Odpowiedź @ PeYoTIL przy użyciu BeautifulSoup i eliminacji stylu i treści skryptu nie działała dla mnie. Wypróbowałem go
decompose
zamiast,extract
ale nadal nie działało. Więc stworzyłem własny, który również formatuje tekst za pomocą<p>
tagów i zamienia<a>
tagi na link href. Radzi sobie również z linkami w tekście. Dostępne w tym zestawieniu z osadzonym dokumentem testowym.źródło
get_text
po prostu tego nie wycina.W Pythonie 3.x możesz to zrobić w bardzo prosty sposób, importując pakiety „imaplib” i „email”. Mimo, że jest to starszy post, ale może moja odpowiedź może pomóc nowym użytkownikom tego postu.
Teraz możesz wydrukować zmienną ciała i będzie ona w formacie zwykłego tekstu :) Jeśli jest dla Ciebie wystarczająco dobra, dobrze byłoby wybrać ją jako zaakceptowaną odpowiedź.
źródło
text/plain
część z wiadomości e-mail, jeśli ktoś ją tam umieści. Nie robi nic, aby przekonwertować HTML na zwykły tekst i nie robi nic zdalnie przydatnego, jeśli próbujesz przekonwertować HTML z, powiedzmy, strony internetowej.możesz wyodrębnić tylko tekst z HTML za pomocą BeautifulSoup
źródło
Podczas gdy wiele osób wspomniało o używaniu wyrażenia regularnego do usuwania tagów HTML, istnieje wiele wad.
na przykład:
Należy przeanalizować do:
Oto krótki fragment, który wymyśliłem, możesz dostosować go do swoich konkretnych potrzeb i działa jak urok
źródło
Kolejny przykład użycia BeautifulSoup4 w Pythonie 2.7.9+
obejmuje:
Kod:
Wyjaśnione:
Wczytaj dane adresu URL jako html (używając BeautifulSoup), usuń wszystkie elementy skryptu i stylu, a także uzyskaj tylko tekst za pomocą .get_text (). Podziel na linie i usuń początkowe i końcowe spacje na każdym z nich, a następnie podziel nagłówki wielu nagłówków na linie, każdy z nich = (fraza.strip () dla linii w linii dla frazy w linii.split („”)). Następnie używając text = '\ n' .join, upuść puste linie, w końcu wróć jako usankcjonowany utf-8.
Uwagi:
Niektóre systemy, na których jest uruchomiony, nie będą działać z połączeniami https: // z powodu problemu z SSL, możesz wyłączyć weryfikację, aby rozwiązać ten problem. Przykładowa poprawka: http://blog.pengyifan.com/how-to-fix-python-ssl-certificate_verify_failed/
Python <2.7.9 może mieć problem z uruchomieniem tego
text.encode ('utf-8') może pozostawić dziwne kodowanie, zamiast tego może po prostu zwrócić str (tekst).
źródło
Oto kod, którego używam regularnie.
Mam nadzieję że to pomogło.
źródło
Komentarz autora LibreOffice ma tę zaletę, że aplikacja może wykorzystywać makra python. Wydaje się, że oferuje wiele korzyści zarówno w przypadku odpowiedzi na to pytanie, jak i rozszerzenia bazy makr LibreOffice. Jeśli ta rozdzielczość jest jednorazową implementacją, a nie powinna być używana jako część większego programu produkcyjnego, otwarcie kodu HTML w programie do zapisywania i zapisanie strony jako tekstu wydaje się rozwiązywać omawiane tutaj problemy.
źródło
Sposób Perla (przepraszam mamo, nigdy nie zrobię tego w produkcji).
źródło