Szukam modułu parsera HTML dla Pythona, który może pomóc mi uzyskać tagi w postaci list / słowników / obiektów Pythona.
Jeśli mam dokument w formie:
<html>
<head>Heading</head>
<body attr1='val1'>
<div class='container'>
<div id='class'>Something here</div>
<div>Something else</div>
</div>
</body>
</html>
to powinno dać mi dostęp do zagnieżdżonych tagów poprzez nazwę lub identyfikator tagu HTML, tak że mogę w zasadzie poprosić go o przesłanie zawartości / tekstu do div
tagu class='container'
zawierającego się w body
tagu lub coś podobnego.
Jeśli używałeś funkcji Firefox „Inspect element” (zobacz HTML), wiedziałbyś, że daje ci wszystkie tagi w ładnie zagnieżdżony sposób, jak drzewo.
Wolałbym wbudowany moduł, ale może to wymagać trochę za dużo.
Przeszedłem wiele pytań na temat przepełnienia stosu i kilka blogów w Internecie, a większość z nich sugeruje BeautifulSoup lub lxml lub HTMLParser, ale kilka z nich szczegółowo opisuje funkcjonalność i po prostu kończy się debatą, która z nich jest szybsza / bardziej wydajna.
źródło
Odpowiedzi:
Chyba nie potrzebujesz opisów wydajności - po prostu przeczytaj, jak działa BeautifulSoup. Spójrz na jego oficjalną dokumentację .
źródło
from bs4 import BeautifulSoup
lxml
zamiast tego użyj biblioteki (patrz odpowiedź poniżej). Zecssselect
jest to bardzo przydatne również i wydajność jest często 10- do 100-krotnie lepiej niż w innych dostępnych bibliotek.class
atrybut jest specjalny:BeautifulSoup(html).find('div', 'container').text
Myślę, że szukasz piractwa :
Przykładem tego, co chcesz, może być:
I używa tych samych selektorów, co element kontrolny przeglądarki Firefox lub Chrome. Na przykład:
Selektem sprawdzanego elementu jest „div # mw-head.noprint”. Tak więc w pirotechnice wystarczy przekazać ten selektor:
źródło
Tutaj możesz przeczytać więcej o różnych parserach HTML w Pythonie i ich wydajności. Mimo że artykuł jest nieco przestarzały, nadal daje dobry przegląd.
Wydajność parsera HTML w Pythonie
Polecam BeautifulSoup, mimo że nie jest wbudowana. Tylko dlatego, że tak łatwo jest pracować z tego rodzaju zadaniami. Na przykład:
źródło
from bs4 import BeautifulSoup
W porównaniu z innymi bibliotekami parsera
lxml
jest niezwykle szybki:A dzięki
cssselect
dość łatwemu w użyciu również do skrobania stron HTML:lxml.html Dokumentacja
źródło
import requests
, zapisz bufor do pliku: stackoverflow.com/a/14114741/1518921 (lub urllib), po załadowaniu zapisanego pliku za pomocą parsowania,doc = parse('localfile.html').getroot()
1.7
sekundę, ale zastosowanie lxml zamiast tego przyspieszyło go prawie*100
razy SZYBCIEJ! Jeśli zależy Ci na wydajności, najlepszym rozwiązaniem jest lxmlPolecam lxml do analizowania HTML. Zobacz „Analiza składni HTML” (na stronie lxml).
Z mojego doświadczenia wynika, że Beautiful Soup nie działa na skomplikowanym HTML. Uważam, że dzieje się tak, ponieważ Piękna Zupa nie jest parserem, a raczej bardzo dobrym analizatorem strun.
źródło
Polecam użycie biblioteki justext :
https://github.com/miso-belica/jusText
Zastosowanie: Python2:
Python3:
źródło
Użyłbym EHP
https://github.com/iogf/ehp
Oto on:
Wynik:
źródło