BeautifulSoup: «Возникло исключение: KeyError 'id'» при использовании функции с методом .find_all () - PullRequest
0 голосов
/ 19 апреля 2020

Я пытаюсь использовать BeautifulSoup для создания скребка, который будет снимать баллы с отметок www.basketball-reference.com. Пример страницы с оценками ящиков будет this . Таблицы оценок ящиков, которые я хочу, находятся под тегом таблицы, имеют идентификатор, который содержит слово «basi c» (это отличает его от таблиц с расширенной статистикой). Я подумал, что функция лучше всего подойдет для выявления этого различия. Html выглядит следующим образом.

Мой код:

r = requests.get(https://www.basketball-reference.com/boxscores/202003110ATL.html).content
soup = BeautifulSoup(r, 'lxml')

def get_boxscore_basic_table(tag):
    return ('basic' in tag.attrs['id']) and ('sortable' in tag.attrs['class'])

tables = soup.find_all(get_boxscore_basic_table)

Это выдает: "KeyError 'id'", и я запутался, как это исправить , Я проверил ключи, взяв только первый экземпляр, используя .find ():

table = soup.find('table')
print('table.attrs')

И ключ 'id' там. Почему он не может найти мой указанный c запрос при поиске по всему html и как я могу это исправить?

Ответы [ 2 ]

0 голосов
/ 19 апреля 2020

Вы были довольно близко! Проблема заключается в том, что некоторые элементы не имеют идентификатора и класса, что приводит к ошибке при попытке доступа к отсутствующим атрибутам.

Это должно работать правильно:

import requests
from bs4 import BeautifulSoup

r = requests.get("https://www.basketball-reference.com/boxscores/202003110ATL.html")
soup = BeautifulSoup(r.content, 'lxml')


def valid_boxscore_basic_table_elem(tag):
    tag_id = tag.get("id")
    tag_class = tag.get("class")
    return (tag_id and tag_class) and ("basic" in tag_id and "sortable" in tag_class)


tables = soup.find_all(valid_boxscore_basic_table_elem)

print(tables)

Будьте осторожны при использовании in, однако помните, что "cat" in "caterpillar" равно True.


. код можно упростить и сделать более универсальным за счет использования некоторых базовых c регулярных выражений:

import re

import requests
from bs4 import BeautifulSoup

r = requests.get("https://www.basketball-reference.com/boxscores/202003110ATL.html")
soup = BeautifulSoup(r.content, 'lxml')

valid_id_re = re.compile(r"-basic$")
valid_class_re = re.compile(r" ?sortable ?")

tables = soup.find_all("table", attrs={"id": valid_id_re.search, "class": valid_class_re.search})
0 голосов
/ 19 апреля 2020

Вы можете попробовать это, он использует селектор CSS, чтобы найти идентификатор, содержащий basi c и класс, содержащий сортируемый

import requests
from bs4 import BeautifulSoup
r = requests.get('https://www.basketball-reference.com/boxscores/202003110ATL.html').content
soup = BeautifulSoup(r, 'html.parser')
print(soup.select('table[id*="basic"][class*="sortable"]'))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...