BeautifulSoup в Python Ошибка при использовании .find - PullRequest
0 голосов
/ 02 марта 2019

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

Я пытаюсь извлечь общее количество отскоков за игру из этого супового объекта.

Я попытался использовать следующий код, но получил ошибку:

import urllib.request
from bs4 import BeautifulSoup
import csv

url = "https://www.basketball-reference.com/players/a/abdulza01.html" 
request = urllib.request.Request(url) # create request object
response = urllib.request.urlopen(request) 
html = response.read().decode('unicode_escape') # convert to unicode format
soup = BeautifulSoup(html, "html.parser")    
table = soup.find('table', attrs={'id': 'per_game'})
results = table.find_all('tr')
for result in results[1:len(results)]:
    data = result.find_all('td')
data.find(attrs={'data-stat': 'trb_per_g'}).getText()  
data = [<td class="center iz" data-stat="age"></td>,
     <td class="left " data-stat="team_id"><a href="/teams/BOS/">BOS</a></td>,
     <td class="left " data-stat="lg_id">NBA</td>,
     <td class="center iz" data-stat="pos"></td>,
     <td class="right " data-stat="g">2</td>,
     <td class="right incomplete iz" data-stat="gs"></td>,
     <td class="right " data-stat="mp_per_g">12.0</td>,
     <td class="right " data-stat="fg_per_g">1.5</td>,
     <td class="right " data-stat="fga_per_g">6.5</td>,
     <td class="right " data-stat="fg_pct">.231</td>,
     <td class="right " data-stat="ft_per_g">1.0</td>,
     <td class="right " data-stat="fta_per_g">1.5</td>,
     <td class="right " data-stat="ft_pct">.667</td>,
     <td class="right " data-stat="orb_per_g">3.0</td>,
     <td class="right " data-stat="drb_per_g">4.5</td>,
     <td class="right " data-stat="trb_per_g">**7.5**</td>,
     <td class="right " data-stat="ast_per_g">1.5</td>,
     <td class="right " data-stat="stl_per_g">0.5</td>,
     <td class="right " data-stat="blk_per_g">0.5</td>,
     <td class="right " data-stat="tov_per_g">1.5</td>,
     <td class="right " data-stat="pf_per_g">2.0</td>,
     <td class="right " data-stat="pts_per_g">4.0</td>]

Сообщение об ошибке: AttributeError: у объекта ResultSet нет атрибута «найти».Вы, вероятно, рассматриваете список предметов как отдельный предмет.Вы вызывали find_all (), когда намеревались вызвать find ()?

Что-то концептуально не так с кодом?

Ответы [ 3 ]

0 голосов
/ 02 марта 2019

При поиске по значениям attribute вы также должны указать имя tag.Попробуйте этот код ниже. Если только один элемент хочет выполнить поиск, попробуйте find. Если более одного элемента хотите выполнить поиск, попробуйте find_all, а затем повторите цикл. Надеюсь, это поможет.

 from bs4 import BeautifulSoup
    html="""<html><td class="center iz" data-stat="age"></td>,
         <td class="left " data-stat="team_id"><a href="/teams/BOS/">BOS</a></td>,
         <td class="left " data-stat="lg_id">NBA</td>,
         <td class="center iz" data-stat="pos"></td>,
         <td class="right " data-stat="g">2</td>,
         <td class="right incomplete iz" data-stat="gs"></td>,
         <td class="right " data-stat="mp_per_g">12.0</td>,
         <td class="right " data-stat="fg_per_g">1.5</td>,
         <td class="right " data-stat="fga_per_g">6.5</td>,
         <td class="right " data-stat="fg_pct">.231</td>,
         <td class="right " data-stat="ft_per_g">1.0</td>,
         <td class="right " data-stat="fta_per_g">1.5</td>,
         <td class="right " data-stat="ft_pct">.667</td>,
         <td class="right " data-stat="orb_per_g">3.0</td>,
         <td class="right " data-stat="drb_per_g">4.5</td>,
         <td class="right " data-stat="trb_per_g">**7.5**</td>,
         <td class="right " data-stat="ast_per_g">1.5</td>,
         <td class="right " data-stat="stl_per_g">0.5</td>,
         <td class="right " data-stat="blk_per_g">0.5</td>,
         <td class="right " data-stat="tov_per_g">1.5</td>,
         <td class="right " data-stat="pf_per_g">2.0</td>,
         <td class="right " data-stat="pts_per_g">4.0</td></html>"""

    soup = BeautifulSoup(html,'html.parser')
    findtag=soup.find('td',attrs={"data-stat" : "trb_per_g" })
    print(findtag.text)

Для поискаПопробуйте несколько элементов.

findtags=soup.find_all('td',attrs={"data-stat" : "trb_per_g" })
for tag in findtags:
  print(tag.text)
0 голосов
/ 02 марта 2019

Я думаю, что было бы быстрее использовать комбинацию селектора css для таргетинга по идентификатору таблицы и атрибуту = значение для интересующих ячеек td

import requests
from bs4 import BeautifulSoup as bs
import pandas as pd

url = "https://www.basketball-reference.com/players/a/abdulza01.html" 
soup = bs(requests.get(url).content, 'lxml')
data = [item.text for item in soup.select('#per_game [data-stat=trb_per_g]')]
df = pd.DataFrame(data)
df.rename(columns=df.iloc[0], inplace = True)
df.drop(df.index[0], inplace = True)
print(df)
df.to_csv(r'C:\Users\Users\Desktop\Data.csv', sep=',', encoding='utf-8',index = False )
0 голосов
/ 02 марта 2019

Я думаю, что вот ответ на ваш вопрос: Beautiful Soup: у объекта 'ResultSet' нет атрибута 'find_all'?

У объекта ResultSet нет атрибута 'find'.Что вы можете сделать, так это получить доступ к каждому элементу и использовать команду «найти», чтобы найти то, что вы хотите.

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