Beautful Soup найти кнопки внутри див - PullRequest
0 голосов
/ 08 марта 2020

Я хочу найти текст внутри каждой кнопки таблицы. Я хочу проанализировать каждую вложенную таблицу в отдельности, поэтому я хочу знать соответствующую кнопку для разделения каждой таблицы.

Пока у меня есть это:

default_url = 'https://fbref.com'
url = default_url + row['squad_href']
res = requests.get(url)
## The next two lines get around the issue with comments breaking the parsing.
comm = re.compile("<!--|-->")
soup = BeautifulSoup(comm.sub("",res.text),'lxml')
info = soup.findAll("div", {"class": "sub_section_heading"}) #my button class

это возвращает:

[<div class="sub_section_heading"> <button class="sr_preset tooltip visible active" data-hide="[id^=all_stats_standard_ks]" data-show="#all_stats_standard_ks_3232" id="button_stats_standard_ks_3232" onclick="setTimeout(function(){sr_st_construct_stats_table_features('stats_standard_ks_3232'); }, 100);" type="button">Premier League</button>
<button class="sr_preset tooltip visible" data-hide="[id^=all_stats_standard_ks]" data-show="#all_stats_standard_ks_2901" id="button_stats_standard_ks_2901" onclick="setTimeout(function(){sr_st_construct_stats_table_features('stats_standard_ks_2901'); }, 100);" type="button">Europa League</button>
<button class="sr_preset tooltip visible" data-hide="[id^=all_stats_standard_ks]" data-show="#all_stats_standard_ks_8833" id="button_stats_standard_ks_8833" onclick="setTimeout(function(){sr_st_construct_stats_table_features('stats_standard_ks_8833'); }, 100);" type="button">EFL Cup</button>
<button class="sr_preset tooltip visible" data-hide="[id^=all_stats_standard_ks]" data-show="#all_stats_standard_ks_5591" id="button_stats_standard_ks_5591" onclick="setTimeout(function(){sr_st_construct_stats_table_features('stats_standard_ks_5591'); }, 100);" type="button">FA Cup</button>
<button class="sr_preset tooltip visible" data-hide="[id^=all_stats_standard_ks]" data-show="#all_stats_standard_ks_combined" id="button_stats_standard_ks_combined" onclick="setTimeout(function(){sr_st_construct_stats_table_features('stats_standard_ks_combined'); }, 100);" type="button">All Competitions</button>
</div>

Я хочу что-то, что возвращает массив с именем каждой кнопки, в этом case будет примерно таким: [ 'Premier League', 'Europa League', 'EFL Cup', 'FA Cup', 'All Competitions']

Любое предложение высоко ценится

1 Ответ

0 голосов
/ 08 марта 2020

Вы выбираете div, когда на самом деле вас интересуют значения, содержащиеся в кнопках внутри этих div. Первой задачей было бы получить кнопки. Чтобы сделать это, давайте изменим select

info = soup.select(".sub_section_heading button")

. При этом получаются все кнопки, содержащиеся в div с классом .sub_section_heading.

. Здесь вы хотите создать список, содержащий только текст в кнопке немного понимания списка поможет здесь.

button_texts = [x.text for x in info]

button_texts будет список только с названиями кнопок, но могут быть повторы, если есть несколько div. Чтобы сделать список отчетливым, используйте

distinct_texts = list(set(button_texts))

Полный код для этого приведен ниже.

default_url = 'https://fbref.com'
url = default_url + row['squad_href']
res = requests.get(url)
## The next two lines get around the issue with comments breaking the parsing.
comm = re.compile("<!--|-->")
soup = BeautifulSoup(comm.sub("",res.text),'lxml')
info = soup.select(".sub_section_heading button")
button_texts = [x.text for x in info]
distinct_texts = list(set(button_texts))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...