Jak przeanalizować pliki XML za pomocą Pięknej Python's Beautifulsoup

Jak przeanalizować pliki XML za pomocą Pięknej Python's Beautifulsoup

Dane są dosłownie wszędzie, we wszystkich dokumentach. Ale nie wszystko jest przydatne, stąd potrzeba przeanalizowania go, aby uzyskać potrzebne części. Dokumenty XML są jednym z takich dokumentów, które przechowują dane. Są bardzo podobne do plików HTML, ponieważ mają prawie ten sam rodzaj struktury. Dlatego musisz je przeanalizować, aby uzyskać niezbędne informacje, tak jak podczas pracy z HTML.Istnieją dwa główne aspekty analizowania plików XML. Oni są:

  • Znalezienie tagów
  • Wyodrębnienie z tagów

Musisz znaleźć znacznik, który zawiera żądane informacje, a następnie wyodrębnić te informacje. Dowiesz się, jak robić zarówno podczas pracy z plikami XML przed końcem tego artykułu.

Instalacja

BeautifulSoup to jedna z najczęściej używanych bibliotek, jeśli chodzi o skrobanie internetowe z Pythonem. Ponieważ pliki XML są podobne do plików HTML, jest również w stanie je analizować. Aby parsować pliki XML za pomocą BeautifulSoup, najlepiej jest korzystać z Pythona lxml Parser.

Możesz zainstalować obie biblioteki za pomocą pypeć Narzędzie instalacyjne, za pośrednictwem poniższego polecenia:

instaluj PIP BS4 LXML

Aby potwierdzić, że obie biblioteki są pomyślnie zainstalowane, możesz aktywować interaktywną powłokę i spróbować zaimportować oba. Jeśli nie pojawi się błąd, jesteś gotowy do reszty artykułu.

Oto przykład:

$ Python
Python 3.7.4 (tagi/v3.7.4: E09359112E, 8 lipca 2019, 20:34:20)
[MSC v.1916 64 bit (AMD64)] na Win32
Wpisz „Pomoc”, „Copyright”, „Kredyty” lub „Licencja”, aby uzyskać więcej informacji.
>>> Importuj BS4
>>> Importuj LXML
>>>

Przed przejściem należy utworzyć plik XML z fragmentu kodu poniżej. To dość proste i powinno pasować do przypadków użycia, o których poznasz w pozostałej części artykułu. Po prostu skopiuj, wklej w edytorze i zapisz; nazwa jak próbka.XML powinien wystarczyć.



Drzewo

Pierwszy
Drugi

Trzeci

Jeden
Dwa
Bliźnięta


Czwarty

Teraz w twoim skrypcie Pythona; Musisz odczytać plik XML jak normalny plik, a następnie przekazać go do BeautifulSoup. Pozostała część tego artykułu będzie korzystać z BS_Content zmienne, więc ważne jest, aby zrobić ten krok.

# Importuj BeautifulSoup
z BS4 importuj Beautifulsoup jako BS
content = []
# Przeczytaj plik XML
z otwartą („próbka.xml ",„ r ”) jako plik:
# Przeczytaj każdy wiersz w pliku, ReadLines () zwraca listę linii
content = plik.ReadLines ()
# Połącz linie na liście w ciągu
content = "".dołącz (treść)
bs_content = bs (content, „lxml”)

Próbka kodu powyżej importu Piękna grupa, Następnie odczytuje plik XML jak zwykły plik. Następnie przekazuje treść do importowanego Piękna grupa Biblioteka, a także parser wyboru.

Zauważysz, że kod się nie importuje lxml. To nie musi Piękna grupa wybierze lxml parser w wyniku przejścia „LXML” do obiektu.

Teraz możesz kontynuować resztę artykułu.

Znalezienie tagów

Jednym z najważniejszych etapów analizowania plików XML jest wyszukiwanie tagów. Istnieją różne sposoby, aby to zrobić podczas korzystania z BeautifulSoup; Musisz więc wiedzieć o garstce z nich, aby mieć najlepsze narzędzia do odpowiedniej sytuacji.

Tagi można znaleźć w dokumentach XML przez:

  • Nazwy
  • Relacje

Znalezienie tagów według nazwisk

Istnieją dwie metody pięknej grupy, których można użyć, znajdując tagi według nazwisk. Jednak przypadki użycia różnią się; Rzućmy na nich okiem.

znajdować

Z osobistego doświadczenia użyjesz znajdować metoda częściej niż inne metody znajdowania tagów w tym artykule. Tag Find otrzymuje nazwę znacznika, który chcesz uzyskać, i zwraca obiekt pięknego tagu, jeśli go znajdzie; W przeciwnym razie wraca Nic.

Oto przykład:

>>> wynik = bs_content.Znajdź („Dane”)
>>> Drukuj (wynik)
Jeden
>>> wynik = bs_content.Znajdź („unikalny”)
>>> Drukuj (wynik)
Bliźnięta
>>> wynik = bs_content.Znajdź („ojciec”)
>>> Drukuj (wynik)
Nic
>>> wynik = bs_content.Znajdź („matka”)
>>> Drukuj (wynik)
Nic

Jeśli spojrzysz na przykład, zobaczysz, że znajdować Metoda zwraca znacznik, jeśli pasuje do nazwy, w przeciwnym razie nie zwraca. Jeśli jednak przyjrzysz się temu bliżej, zobaczysz, że zwraca tylko jeden znacznik.

Na przykład, kiedy Znajdź („Dane”) został wezwany, zwrócił tylko pierwszy znacznik danych, ale nie zwrócił pozostałych.

GOTCHA: znajdować Metoda zwróci tylko pierwszy znacznik, który pasuje do jego zapytania.

Jak możesz też znaleźć inne tagi? To prowadzi nas do następnej metody.

Znajdź wszystko

Znajdź wszystko Metoda jest dość podobna do znajdować metoda. Jedyną różnicą jest to, że zwraca listę tagów, które pasują do jego zapytania. Gdy nie znajdzie żadnego znacznika, po prostu zwraca pustą listę. Stąd, Znajdź wszystko Zawsze zwraca listę.

Oto przykład:

>>> wynik = bs_content.Find_All („Data”)
>>> Drukuj (wynik)
[[[Jeden, Dwa]
>>> wynik = bs_content.Find_All („dziecko”)
>>> Drukuj (wynik)
[[[Pierwszy, Drugi,
Trzeci

Jeden
Dwa
Bliźnięta

,
Czwarty]
>>> wynik = bs_content.Find_All („ojciec”)
>>> druk (wynik
[] []
>>> wynik = bs_content.Find_All („Mother”)
>>> Drukuj (wynik)
[] []

Teraz, gdy wiesz, jak korzystać z znajdować I Znajdź wszystko Metody, możesz wyszukać tagi w dowolnym miejscu w dokumencie XML. Jednak możesz uczynić swoje wyszukiwania mocniejsze.

Oto jak:

Niektóre tagi mogą mieć tę samą nazwę, ale różne atrybuty. Na przykład dziecko Tagi mają nazwa atrybut i różne wartości. Możesz przeprowadzić konkretne wyszukiwania na podstawie tych.

Spójrz na to:

>>> wynik = bs_content.Znajdź („dziecko”, „nazwa”: „Rose”)
>>> Drukuj (wynik)
Drugi
>>> wynik = bs_content.Find_All („dziecko”, „nazwa”: „Rose”)
>>> Drukuj (wynik)
[[[Drugi]
>>> wynik = bs_content.Znajdź („dziecko”, „nazwa”: „jack”)
>>> Drukuj (wynik)
Pierwszy
>>> wynik = bs_content.Find_All („child”, „nazwa”: „jack”)
>>> Drukuj (wynik)
[[[Pierwszy]

Zobaczysz, że w użyciu jest coś innego znajdować I Znajdź wszystko Metody tutaj: oba mają drugi parametr.

Kiedy przechodzisz w słowniku jako drugi parametr, znajdować I Znajdź wszystko Metody dalsze wyszukiwanie w celu uzyskania tagów, które mają atrybuty i wartości, które pasują do dostarczonego klucza: Para wartości.

Na przykład, pomimo użycia znajdować Metoda w pierwszym przykładzie zwróciła drugą dziecko tag (zamiast pierwszego dziecko tag), ponieważ to pierwszy tag pasujący do zapytania. Znajdź wszystko Tag podąża za tą samą zasadą, z tym wyjątkiem, że zwraca wszystkie tagi, które pasują do zapytania, a nie tylko pierwsze.

Znalezienie tagów według relacji

Chociaż mniej popularne niż wyszukiwanie według nazw tagów, możesz również wyszukiwać tagi według relacji. W prawdziwym sensie jest to bardziej nawigacja niż przeszukiwanie.

Istnieją trzy kluczowe relacje w dokumentach XML:

  • Rodzic: Tag, w którym istnieje znacznik odniesienia.
  • Dzieci: Tagi, które istnieją w znaczniku referencyjnym.
  • Rodzeństwo: Tagi istniejące na tym samym poziomie co znacznik odniesienia.

Z powyższego wyjaśnienia możesz wywnioskować, że znacznik referencyjny jest najważniejszym czynnikiem w poszukiwaniu znaczników według relacji. Dlatego poszukajmy znacznika referencyjnego i kontynuuj artykuł.

Popatrz na to:

>>> trzeci_child = bs_content.Znajdź („dziecko”, „nazwa”: „Blue Ivy”)
>>> drukuj (trzeci_child)

Trzeci

Jeden
Dwa
Bliźnięta

Z powyższego przykładu kodu znacznik odniesienia dla reszty tego rozdziału będzie trzecim dziecko tag, przechowywany w trzeci_child zmienny. W poniższych podsekcjach zobaczysz, jak szukać tagów w oparciu o relacje ich rodzica, rodzeństwa i dzieci z tagiem referencyjnym.

Znalezienie rodziców

Aby znaleźć nadrzędny tag znacznika odniesienia, użyjesz z rodzic atrybut. W ten sposób zwraca znacznik nadrzędny, a także tagi pod nim. To zachowanie jest dość zrozumiałe, ponieważ znaczniki dzieci są częścią znacznika nadrzędnego.

Oto przykład:

>>> wynik = trzeci_child.rodzic
>>> Drukuj (wynik)

Pierwszy
Drugi

Trzeci

Jeden
Dwa
Bliźnięta


Czwarty

Znalezienie dzieci

Aby znaleźć znaczniki dla dzieci znacznika referencyjnego, skorzystasz z dzieci atrybut. Wykonanie tego zwraca tagi dzieci, a także podgapiaty pod każdym z nich. To zachowanie jest również zrozumiałe, ponieważ tagi dzieci często mają również własne tagi dzieci.

Należy zauważyć, że dzieci atrybut zwraca tagi dzieci jako generator. Więc jeśli potrzebujesz listy tagów dla dzieci, musisz przekonwertować generator na listę.

Oto przykład:

>>> Wynik = lista (trzeci_child.dzieci)
>>> Drukuj (wynik)
['\ n trzeci \ n',
Jeden
Dwa
Bliźnięta
, '\N']

Jeśli przyjrzysz się bliżej powyższego przykładu, zauważysz, że niektóre wartości na liście nie są tagami. To jest coś, na co musisz uważać.

GOTCHA: dzieci Atrybut nie tylko zwraca znaczniki dla dzieci, ale także zwraca tekst w znaczniku referencyjnym.

Znalezienie rodzeństwa

Ostatnią w tej sekcji jest znalezienie tagów, które są rodzeństwem do znacznika referencyjnego. Dla każdego znacznika referencyjnego mogą istnieć tagi rodzeństwa przed i po nim. Poprzednie_siblings atrybut zwróci tagi rodzeństwa przed znacznikiem odniesienia i Next_siblings atrybut zwróci po nim tagi rodzeństwa.

Tak jak dzieci atrybut, Poprzednie_siblings I Next_siblings Atrybuty zwrócą generatory. Musisz więc przekonwertować na listę, jeśli potrzebujesz listy rodzeństwa.

Popatrz na to:

>>> Lista poprzednich_siblingów (trzeci_child.poprzednie_siblings)
>>> Drukuj (poprzednie_siblings)
['\N', Drugi, '\N',
Pierwszy, '\N']
>>> Next_siblings = List (trzeci_child.Next_siblings)
>>> Drukuj (Next_Siblings)
['\N', Czwarty]
>>> Drukuj (poprzednie_siblings + Next_Siblings)
['\N', Drugi, '\N', Pierwszy,
„\ n”, „\ n”, Czwarty, '\N']

Pierwszy przykład pokazuje poprzednie rodzeństwo, drugie pokazuje następne rodzeństwo; Następnie oba wyniki są łączone w celu wygenerowania listy wszystkich rodzeństwa dla znacznika referencyjnego.

Wyodrębnienie z tagów

Podczas analizowania dokumentów XML wiele prac polega na znalezieniu odpowiednich tagów. Jednak kiedy je znajdziesz, możesz również chcieć wyodrębnić pewne informacje z tych tagów i tego właśnie nauczy się ta sekcja.

Zobaczysz, jak wyodrębnić następujące czynności:

  • Wartości atrybutu znacznika
  • Tag Tekst
  • TAG TREAT

Wyodrębnienie wartości atrybutów znacznika

Czasami możesz mieć powód do wyodrębnienia wartości atrybutów w znaczniku. Na przykład w następującym parowaniu wartości atrybutów: name = ”Rose”, Możesz chcieć wydobyć „Rose."

Aby to zrobić, możesz skorzystać z Dostawać Metoda lub dostęp do nazwy atrybutu za pomocą [] [] Jak indeks, tak jak podczas pracy ze słownikiem.

Oto przykład:

>>> wynik = trzeci_child.Get („Nazwa”)
>>> Drukuj (wynik)
Niebieski bluszcz
>>> wynik = trzeci_child [„nazwa”]
>>> Drukuj (wynik)
Niebieski bluszcz

Wyodrębnienie tekstu znacznika

Gdy chcesz uzyskać dostęp do wartości tekstowych tagu, możesz użyć tekst Lub smyczki atrybut. Oba zwrócą tekst w znaczniku, a nawet znaczniki dzieci. Jednakże tekst Atrybut zwróci je jako pojedynczy ciąg, połączony; podczas smyczki Atrybut zwróci je jako generator, który można przekonwertować na listę.

Oto przykład:

>>> wynik = trzeci_child.tekst
>>> Drukuj (wynik)
'\ n trzeci \ n \ none \ ntwo \ ntwins \ n \ n' '
>>> Wynik = lista (trzeci_child.smyczki)
>>> Drukuj (wynik)
['\ n trzeci \ n', '\ n', ', „one', '\ n', ',', '\ n',„ bliźniaki ',' \ n ',' \ n ']

Wyodrębnienie zawartości znacznika

Od pomocy wyodrębniające wartości atrybutu i tekst tagów, możesz również wyodrębnić całą zawartość tagów. Aby to zrobić, możesz użyć zawartość atrybut; Jest trochę podobny do dzieci atrybut i da te same wyniki. Jednak podczas gdy dzieci atrybut zwraca generator, zawartość Atrybut zwraca listę.

Oto przykład:

>>> wynik = trzeci_child.zawartość
>>> Drukuj (wynik)
['\ n trzeci \ n',
Jeden
Dwa
Bliźnięta
, '\N']

Drukowanie pięknego

Jak dotąd widziałeś kilka ważnych metod i atrybutów, które są przydatne podczas analizowania dokumentów XML za pomocą pięknej grupy. Ale jeśli zauważysz, gdy drukujesz znaczniki na ekranie, mają one jakiś klastrowy wygląd. Chociaż wygląd może nie mieć bezpośredniego wpływu na Twoją wydajność, może pomóc ci bardziej skutecznie i sprawić, że praca jest mniej żmudna.

Oto przykład drukowania normalnego sposobu:

>>> drukuj (trzeci_child)

Trzeci

Jeden
Dwa
Bliźnięta

Możesz jednak poprawić jego wygląd, używając upiększać metoda. Po prostu zadzwoń upiększać metoda na tagu podczas drukowania, a dostaniesz coś przyjemnego wizualnie.

Popatrz na to:

Wniosek

Parsowanie dokumentów jest ważnym aspektem pozyskiwania danych. Dokumenty XML są dość popularne i miejmy nadzieję, że lepiej jest je przyjmować i wyodrębnić żądane dane.

Z tego artykułu możesz teraz:

  • Wyszukaj tagi według nazw lub relacji
  • Wyodrębnij dane z tagów

Jeśli czujesz się dość zagubiony i jesteś całkiem nowy w bibliotece Pięknej, możesz sprawdzić samouczek Pięknych.