BeautifulSoup найти вложенные теги, дети - PullRequest
0 голосов
/ 25 июня 2018

Я вижу кучу информации о поиске тегов и информации внутри тегов, но я не могу найти что-то столь же простое. Я пытаюсь получить доступ к тексту или названию элемента «a» (в данном случае «United States») в третьем элементе «td». Проблема, с которой я сталкиваюсь, заключается в том, что «стиль» 3-го элемента «td» такой же, как и у первого элемента «td» («text-align: left»), поэтому я не могу фильтровать с этим, и nextSibling только позвольте мне перейти на один уровень вниз, ко второму элементу "td". Остальная часть моего кода работает (хотя он заставляет меня использовать то, что я считаю устаревшим синтаксисом BeautifulSoup, хотя у меня установлены Python 3.6.5 и BS 4.6. Думаю, это еще одна проблема). Я пытаюсь заставить работать переменную "страна", и я пробовал несколько вещей, но ничего из того, что я пробовал, не работает, за исключением того, что я ставлю в конце кучу .next.next.next.

HTML (https://en.wikipedia.org/wiki/Toronto_FC#Current_roster):

<td style="text-align: left">
  <a href="/wiki/Goalkeeper_(association_football)"
  title="Goalkeeper (association football)">Goalkeeper</a>
</td>
<td style="padding-right:15px;">
    <span class="fn">...</span>
</td>
<td style="text-align: left">
    <span class="flagicon">...</span>
    <a href="/wiki/United_States" title="United States">United States</a> 
</td>

Мой код:

vcard = page_soup.findAll("tr", {"class": "vcard agent"})
cards = vcard[0]

for cards in vcard:
    league = page_soup.find("a", {"title": "Major League Soccer"})
    league_name = league.text

    team = page_soup.find("h1", {"class": "firstHeading"})
    team_name = team.text

    position = cards.a.text

    name = cards.findAll("span", {"class": "fn"})
    player_name = unidecode(name[0].text)

    ***this variable not working***
    country = cards.find("td", {"style": "text-align: left")

1 Ответ

0 голосов
/ 25 июня 2018

при сомнении используйте css-селекторы. если нет сомнений, используйте css-селекторы

но очевидно, что это работает, только если вы уверены, что всегда будет третьим td

country = cards.select_one('td:nth-of-type(3) a')
print(country['title'], country.text)
...