• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Jak pobrać wartość text z zagnieżdżonej struktury HTML za pomocą BeautifulSoup

Object Storage Arubacloud
0 głosów
459 wizyt
pytanie zadane 10 lutego 2021 w Python przez TeaCup Obywatel (1,370 p.)

Hej,

Mam kod:

<td class="to-jest-klasa-td">
    <a href="https://jakis1.com">Title Link 1</a>
</td>
<td class="to-jest-klasa-td">
    <a href="https://jakis2.com">Title Link 2</a>
</td>
<td class="to-jest-klasa-td">
    <a href="https://jakis3.com">Title Link 3</a>
</td>

Zagnieżdżonych struktur <td> może być więcej.

Chciałbym pobrać z tego za pomocą BeautifulSoup i Request text czyli "Title Link 1" itd.

Nie wiem jak zbudować selektor w metodzie find_all tak aby od razy pobierało mi text z znacznika <a>.

Mam coś takiego:

title = soup.find_all("td a", {"class", "to-jest-klasa-td"}).text

Jednak to nie działa.

To co mi zadziałało to było:

titles = []
tedes = soup.find_all("td", {"class", "to-jest-klasa-td"})
for td in tedes:
    titles.append(td.find("a").get("text"))

Jednak wolałbym od razu targetować title w zapytaniu find_all zmiennej soup dlatego że jak bym miał strukturę która by miała więcej poziomów zagnieżdżenia to liczba zagnieżdżonych pętli była by taka sama jak liczba poziomów zagnieżdżeń kodu html.

Czy wie ktoś jak zbudować ten selektor w zmiennej soup, metodzie find_all?

Z góry dzięki za pomoc.

1 odpowiedź

+1 głos
odpowiedź 10 lutego 2021 przez reaktywny Nałogowiec (40,990 p.)
edycja 10 lutego 2021 przez reaktywny
td = soup.find_all("td", class_ = "to-jest-klasa-td")

for td_ in td:

    a = td_.find("a", href= True)

    print(a["href"])

Podałem podobny, ale nie taki sam kod, jak wyciągnąć linki, ty chciałeś tekst, ale to wyciąga się przez JDP print(a.text)

I jest to najprostszy, jeśli nie najlepszy sposób!

Drugi sposób to jest na selektorach, ale wtedy trzeba iterować po n, bo każdy link <A....> będzie miał inny numer.

 

komentarz 15 lutego 2021 przez TeaCup Obywatel (1,370 p.)

Dzięki za odpowiedź @reaktywny. Fajny podałeś kod jednak w ogóle nie o to mi chodziło.

Chodzi mi o to jak pobrać ten text za pomocą selektora w metodzie find_all. Nie wiem czy kojarzysz jQuery, ale tam tak samo używa się selektorów np.:

$.each("td p")

Coś w tym stylu, iteruje po wszystkich p które są w td. 

Właśnie o to mi chodzi, abym mógł w metodzie find_all użyć takich selektorów aby od razu pobrał text w "a". Czyli np.:

soup.find_all("td a")

Nie wiem tylko jak zbudować taki selektor aby mi wyciągał ten text w "a". Sprawa jest banalna tylko trzeba się znać :-).

komentarz 15 lutego 2021 przez TeaCup Obywatel (1,370 p.)

Hej @reaktywny,

Znalazłem coś takiego jak:

soup.select("td a")

https://www.crummy.com/software/BeautifulSoup/bs4/doc/

Myślę że używając tej metody można przechodzić po drzewie DOM tak jak chciałem. Będę musiał to przetestować.

Btw. Dzięki za pomoc :-).

komentarz 17 lutego 2021 przez reaktywny Nałogowiec (40,990 p.)

Tu jest inne rozwiązanie (na selektorze), ale w nim założyłem, że liczba elementów <TD> jest znana (małe uproszczenie kodu ;) )...

 

html = """
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<table>
    <tr>
<td class="to-jest-klasa-td">
    <a href="https://jakis1.com">Title Link 1</a>
</td>
<td class="to-jest-klasa-td">
    <a href="https://jakis2.com">Title Link 2</a>
</td>
<td class="to-jest-klasa-td">
    <a href="https://jakis3.com">Title Link 3</a>
</td>
    </tr>
    </table>
</body>
</html>
"""

from bs4 import BeautifulSoup
soup = BeautifulSoup(html, 'html.parser')

for i in range(1, 4):
    s = soup.select("td.to-jest-klasa-td:nth-child({}) > a:nth-child(1)".format(i))[0]
    print(s.get_text())

 

komentarz 19 lutego 2021 przez TeaCup Obywatel (1,370 p.)
Dzięki @reaktywny.

Podobne pytania

+1 głos
1 odpowiedź 121 wizyt
pytanie zadane 23 czerwca 2020 w Python przez niezalogowany
+1 głos
1 odpowiedź 214 wizyt
pytanie zadane 30 lipca 2021 w Python przez HGH Początkujący (430 p.)
0 głosów
1 odpowiedź 381 wizyt
pytanie zadane 5 grudnia 2019 w Python przez Dawid89 Obywatel (1,100 p.)

92,556 zapytań

141,404 odpowiedzi

319,563 komentarzy

61,942 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...