Получить значения с помощью BS4 - PullRequest
0 голосов
/ 08 октября 2018

Я пытаюсь получить "data-val" из моего супа, но все они представлены в огромном списке и не отформатированы в разных списках / столбцах, как показано на сайте.

Я знаюзаголовки здесь:

<th class="num record drop-3" data-tsorter="data-val">
    <span class="long-points">
     proj. pts.
    </span>
    <span class="short-points">
     pts.
    </span>
   </th>
   <th class="pct" data-tsorter="data-val">
    <span class="full-relegated">
     relegated
    </span>
    <span class="small-relegated">
     rel.
    </span>
   </th>
   <th class="pct" data-tsorter="data-val">
    <span class="full-champ">
     qualify for UCL
    </span>
    <span class="small-champ">
     make UCL
    </span>
   </th>
   <th class="pct sorted" data-tsorter="data-val">
    <span class="drop-1">
     win Premier League
    </span>
    <span class="small-league">
     win league
    </span>
   </th>

Это то, что я пытаюсь:

url = 'https://projects.fivethirtyeight.com/soccer-predictions/premier-league/'
r = requests.get(url = url)
soup = BeautifulSoup(r.text, "html.parser")
table = soup.find("table", {"class":"forecast-table"})
#print(table.prettify())
for i in table.find_all("td", {"class":"pct"}):
     print(i)

Так что в идеале я бы хотел 4 списка, с именами классов, а затем соответствующие значения

1 Ответ

0 голосов
/ 08 октября 2018

Не совсем уверен, какие именно столбцы вы хотите, но он получает все с data-val в атрибутах тега:

import requests
from bs4 import BeautifulSoup

url = 'https://projects.fivethirtyeight.com/soccer-predictions/premier-league/'
r = requests.get(url)

soup = BeautifulSoup(r.text, "html.parser")
table = soup.find("table", {"class": "forecast-table"})

team_rows = table.find_all("tr", {"class": "team-row"})

for team in team_rows:
    print("Team name: {}".format(team['data-str']))

    team_data = team.find_all("td")

    for data in team_data:
        if hasattr(data, 'attrs') and 'data-val' in data.attrs:
            print("\t{}".format(data.attrs['data-val']))
    print("\n")

Если я правильно понимаю ваш вопрос, вы ищетепоследняя пара значений, которые довольно нетегированы в источнике html.В этом случае вы можете просто попытаться найти tag[6], хотя это, конечно, не очень надежно - но этот является разбором html, так что "не очень надежно" является нормой для курса imho.

что я здесь делаю, так это нахожу все строки команд (что легко благодаря названию класса), а затем просто перебираю все теги td, которые есть в строках команд 'tr,

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...