Zasadniczo chcę używać BeautifulSoup do ścisłego przechwytywania widocznego tekstu na stronie internetowej. Na przykład ta strona internetowa jest moim przypadkiem testowym. I przede wszystkim chcę uzyskać tekst podstawowy (artykuł) i może nawet kilka nazw kart tu i tam. Wypróbowałem sugestię w tym pytaniu SO, która zwraca wiele <script>
tagów i komentarzy html, których nie chcę. Nie mogę znaleźć argumentów potrzebnych do funkcji findAll()
, aby uzyskać tylko widoczne teksty na stronie internetowej.
Jak więc mam znaleźć cały widoczny tekst z wyjątkiem skryptów, komentarzy, css itp.?
python
text
beautifulsoup
html-content-extraction
user233864
źródło
źródło
soup.findAll(text=True)
że nigdy nie wiedziałem o tej funkcjiisinstance(element, Comment)
zamiast dopasowywać je do wyrażenia regularnego.soup = BeautifulSoup(html)
elif isinstance(element,bs4.element.Comment):
. Dodałem też „meta” do listy rodziców.elif re.match(r"[\s\r\n]+",str(element)): return False
Zatwierdzona odpowiedź od @jbochi nie działa dla mnie. Wywołanie funkcji str () zgłasza wyjątek, ponieważ nie może zakodować znaków innych niż ASCII w elemencie BeautifulSoup. Oto bardziej zwięzły sposób filtrowania przykładowej strony internetowej do widocznego tekstu.
źródło
str(element)
nie uda się rozwiązać problemów z kodowaniem, spróbujunicode(element)
zamiast tego, jeśli używasz Pythona 2.źródło
Całkowicie szanuję używanie Beautiful Soup do renderowania treści, ale może to nie być idealny pakiet do pozyskiwania renderowanej treści na stronie.
Miałem podobny problem, aby uzyskać renderowaną treść lub widoczną zawartość w typowej przeglądarce. W szczególności miałem wiele być może nietypowych przypadków do pracy z tak prostym przykładem poniżej. W tym przypadku niewyświetlalny znacznik jest zagnieżdżony w znaczniku stylu i nie jest widoczny w wielu przeglądarkach, które sprawdziłem. Istnieją inne odmiany, takie jak zdefiniowanie ustawienia wyświetlania znacznika klasy na none. Następnie używając tej klasy dla div.
Jednym z opublikowanych powyżej rozwiązań jest:
To rozwiązanie z pewnością ma aplikacje w wielu przypadkach i generalnie działa całkiem dobrze, ale w zamieszczonym powyżej html zachowuje tekst, który nie jest renderowany. Po przeszukaniu tak pojawiło się kilka rozwiązań BeautifulSoup get_text nie usuwa wszystkich tagów i JavaScript, a tutaj Rendered HTML na zwykły tekst za pomocą Pythona
Wypróbowałem oba te rozwiązania: html2text i nltk.clean_html i byłem zaskoczony wynikami synchronizacji, więc pomyślałem, że uzasadniają odpowiedź dla potomności. Oczywiście prędkości w dużym stopniu zależą od zawartości danych ...
Jedna odpowiedź od @Helge dotyczyła używania nltk wszystkich rzeczy.
Zwrócenie ciągu znaków z wyrenderowanym kodem HTML działało naprawdę dobrze. Ten moduł nltk był szybszy niż nawet html2text, chociaż być może html2text jest bardziej niezawodny.
źródło
Jeśli zależy Ci na wydajności, oto inny bardziej wydajny sposób:
soup.strings
jest iteratorem i zwraca,NavigableString
dzięki czemu można bezpośrednio sprawdzić nazwę znacznika rodzica, bez przechodzenia przez wiele pętli.źródło
Tytuł znajduje się wewnątrz
<nyt_headline>
tagu, który jest zagnieżdżony w<h1>
tagu i<div>
tagu o identyfikatorze „artykuł”.Powinno działać.
Treść artykułu znajduje się wewnątrz
<nyt_text>
tagu, który jest zagnieżdżony w<div>
tagu o identyfikatorze „articleBody”. Wewnątrz<nyt_text>
elementu sam tekst jest zawarty w<p>
tagach. Obrazy nie znajdują się w tych<p>
tagach. Trudno mi eksperymentować ze składnią, ale spodziewam się, że działająca skrawka będzie wyglądać mniej więcej tak.źródło
Chociaż całkowicie sugerowałbym używanie beautiful-soup w ogóle, jeśli ktoś chce wyświetlić widoczne części źle sformułowanego html (np. Tam, gdzie masz tylko segment lub linię strony internetowej) z jakiegokolwiek powodu, następujące usunie zawartość między tagami
<
i>
:źródło
Korzystanie z BeautifulSoup jest najłatwiejszym sposobem z mniejszą ilością kodu, aby po prostu uzyskać ciągi znaków, bez pustych linii i bzdur.
źródło
Najprostszym sposobem rozwiązania tego przypadku jest użycie
getattr()
. Możesz dostosować ten przykład do swoich potrzeb:Spowoduje to znalezienie elementu tekstowego
"3.7"
w obiekcie znacznika,<span class="ratingsContent">3.7</span>
jeśli on istnieje, jednak domyślnie,NoneType
jeśli go nie ma.źródło
źródło