2010-12-11 10 views
5

Jestem nowy w Pythonie i Beatiful Soup też! Słyszałem o BS. Mówi się, że jest doskonałym narzędziem do analizowania i wydobywania treści. Więc tutaj jestem ...:Piękna zupa [Python] i ekstrakcja tekstu w tabeli

Chcę wziąć zawartość pierwszego td tabeli w dokumencie html . Na przykład: Mam tę tabelę:

Jak mogę użyć beautifulsoup do pobrania tekstu "To jest przykładowy tekst"? Używam soup.findAll ('table', attrs = {'class': 'bp_ergebnis_tab_info'}), aby uzyskać całą tabelę.

Dzięki ... czy powinienem spróbować zdobyć całość z Perlem ... o czym nie jestem zaznajomiony. Kolejnym rozwiązaniem będzie regex w PHP.

Patrz cel [1]: http://www.schulministerium.nrw.de/BP/SchuleSuchen?action=799.601437941842&SchulAdresseMapDO=142323

Uwagi; ponieważ html jest nieco nieważny - myślę, że musimy trochę wyczyścić. To może spowodować wiele kodu PHP - ponieważ chcemy rozwiązać zadanie w PHP. Perl również byłby dobrym rozwiązaniem.

Dziękujemy za kilka wskazówek i pomysłów na punkt wyjścia zerowy

+1

Cóż, najwyraźniej nie udało Ci się uzyskać wiele z pytań na temat Perla, więc nie jestem nawet pewien, dlaczego to pytanie jest oznaczone jako Perl. Ponadto nie twórz nowych kont co kilka tygodni: stwórz nowe i pozostań przy nim. @ Zero wie, o czym mówię. Inni mogą przyjrzeć się http: // stackoverflow.com/users/477580/thebutcher i http://stackoverflow.com/q/3991571/100754 oraz powiązane z tym pytania. –

Odpowiedz

12

Najpierw znajdź tabelę (jak jesteś robić). Korzystanie find zamiast findall powraca pierwsza pozycja na liście (raczej niż powrót do listy wszystkich znalezisk - w takim przypadku musielibyśmy dodać dodatkowy [0] wziąć pierwszy element listy):

table = soup.find('table' ,attrs={'class':'bp_ergebnis_tab_info'}) 

Następnie użyj find ponownie, aby znaleźć pierwsze td:

first_td = table.find('td') 

Następnie użyj renderContents() aby wyodrębnić zawartość tekstową:

text = first_td.renderContents() 

... i praca jest wykonywana (choć można również użyć strip() usunąć początkowe i końcowe spacje:

trimmed_text = text.strip() 

ten powinien dać:

>>> print trimmed_text 
This is a sample text 
>>> 

jako pożądane.

+0

Witaj psmears, bardzo dziękuję za odpowiedź. Zachęcaj mnie do korzystania z Pięknej zupy! Twoje wskazówki były bardzo jasne i zwięzłe. Wielkie dzięki za ten wielki atut "Learing-a-new-technique". Jestem szczęśliwy. Pozdrowienia Zero – zero

+0

Czy można wyszukać za pomocą 'find()' dla zawartości tekstowej zamiast 'text ='? – User

-1

znajdę Piękne Soup bardzo skutecznym narzędziem więc trzymać się go uczyć :-) Jest w stanie przetworzyć stronę z nieprawidłowym znaczników więc powinien być w stanie do obsługi strony, którą polecasz. Możesz użyć komendy BeautifulSoup(html).prettify(), jeśli chcesz uzyskać poprawne sformatowane źródło strony z prawidłowym znacznikiem.

Co do Twojego pytania, wynik pierwszego polecenia soup.findAll(...) jest również piękny Soup obiektu i można wykonać drugie szukanie w nim tak:

table_soup = soup.findAll('table' ,attrs={'class':'bp_ergebnis_tab_info'}) 
your_sample_text = table_soup.find("td").renderContents().strip() 

print your_sample_text 
+0

Witam Martina - bardzo dziękuję za wspaniałe wskazówki. Jestem bardzo szczęśliwy z powodu twojego ogłoszenia: Zachęcaj mnie do nauki Pięknej Zupy! Zrobię! Jeśli chodzi o kod. Zastosuję kod do wspomnianego docelowego adresu URL. Wracam i zgłoś wszystkie moje odkrycia. Jeszcze raz - wielkie dzięki za pomoc! To jest dla mnie wielki atut edukacyjny! Pozdrowienia dla ciebie (i dla całej społeczności) – zero