soup.find("tagName", { "id" : "articlebody" })
Dlaczego to NIE zwraca <div id="articlebody"> ... </div>
tagów i innych elementów? Nic nie zwraca. I wiem na pewno, że istnieje, ponieważ patrzę na to od razu
soup.prettify()
soup.find("div", { "id" : "articlebody" })
też nie działa.
( EDYCJA: Odkryłem, że BeautifulSoup nie analizował poprawnie mojej strony, co prawdopodobnie oznaczało, że strona, którą próbowałem przeanalizować, nie jest poprawnie sformatowana w SGML lub czymkolwiek)
python
beautifulsoup
Tony Stark
źródło
źródło
Odpowiedzi:
Powinieneś zamieścić swój przykładowy dokument, ponieważ kod działa dobrze:
Znajdowanie
<div>
s w środku<div>
działa również:źródło
div = soup.find(id="articlebody")
soup.find('div', id='articlebody')
Aby znaleźć element według jego
id
:źródło
Piękne Soup 4 obsługuje większość selektorów CSS z
.select()
metodą , dlatego można użyćid
przełącznika , takie jak:Jeśli chcesz określić typ elementu, możesz dodać selektor typu przed
id
selektorem:.select()
Sposób powraca zbiór elementów, co oznacza, że będzie takie same wyniki, jak w następującej.find_all()
metody npJeśli chcesz wybrać tylko jeden element, możesz po prostu użyć
.find()
metody :źródło
Myślę, że występuje problem, gdy znaczniki „div” są zbyt zagnieżdżone. Próbuję przeanalizować niektóre kontakty z pliku html Facebooka, a Beautifulsoup nie jest w stanie znaleźć tagów „div” z klasą „fcontent”.
Dzieje się tak również w przypadku innych klas. Kiedy ogólnie wyszukuję elementy div, zwraca tylko te, które nie są zagnieżdżone.
Kod źródłowy html może być dowolną stroną z Facebooka listy znajomych twojego znajomego (nie jednego z twoich znajomych). Jeśli ktoś może to przetestować i udzielić porady, byłbym bardzo wdzięczny.
To jest mój kod, w którym po prostu spróbuję wydrukować liczbę tagów „div” z klasą „fcontent”:
źródło
Najprawdopodobniej z powodu domyślnego parsera beautifulsoup ma problem. Zmień inny parser, na przykład „lxml” i spróbuj ponownie.
źródło
soup = BeautifulSoup(data, parser="html.parser")
W źródle beautifulsoup ta linia pozwala na zagnieżdżanie elementów div w elementach div; więc twoja troska w komentarzu Lukasa nie byłaby uzasadniona.
Myślę, że musisz określić atrybuty, które chcesz, takie jak
źródło
próbowałeś
soup.findAll("div", {"id": "articlebody"})
?brzmi szalenie, ale jeśli usuwasz rzeczy z natury, nie możesz wykluczyć wielu elementów div ...
źródło
Użyłem:
Jako moja składnia dla find / findall; To powiedziawszy, o ile nie ma innych opcjonalnych parametrów między tagiem a listą atrybutów, nie powinno to być inne.
źródło
Zdarzyło mi się również, gdy próbowałem zeskrobać Google.
Skończyło się na użyciu pyquery.
Zainstalować:
Posługiwać się:
źródło
Oto fragment kodu
Jak widać, znajduję wszystkie tagi, a następnie znajduję wszystkie tagi z atrybutem class = "article" w środku
źródło
Id
Nieruchomość jest zawsze identyfikowany. Oznacza to, że możesz go używać bezpośrednio, nawet bez określania elementu. Dlatego jest to plus, jeśli twoje elementy mają to do przeanalizowania zawartości.źródło