使用 BS4 进行网页抓取 - “传递值的长度为 0,索引意味着 7”
Posted
技术标签:
【中文标题】使用 BS4 进行网页抓取 - “传递值的长度为 0,索引意味着 7”【英文标题】:Webscraping using BS4 - "Length of passed values is 0, index implies 7" 【发布时间】:2019-07-26 17:55:09 【问题描述】:我得到一个错误,传递值的长度为 0?
这是我的代码:
import bs4 as bs
import urllib
import urllib.request
import pandas as pd
draft2018 ="https://en.wikipedia.org/wiki/2018_NBA_draft"
draftpage =urllib.request.urlopen(draft2018)
soup=bs.BeautifulSoup(draftpage,"html.parser")
columns = ['Round', 'Pick', 'Player', 'Position',
'Nationality', 'Team', 'School/club team']
df = pd.DataFrame(columns=columns)
table = soup.find("table","class":"wikitable sortable plainrowheaders").tbody
trs = table.find_all("tr")
for tr in trs:
tds = tr.find_all('td')
row = [td.text.replace('\n','') for td in tds]
df = df.append(pd.Series(row, index=columns), ignore_index=True)
有人可以解释这背后的原因吗?
【问题讨论】:
【参考方案1】:使用read_html
作为DataFrames 的返回列表并选择4. DataFrame by indexing [3]
,然后通过字典索引rename
列:
draft2018 = "https://en.wikipedia.org/wiki/2018_NBA_draft"
d = 'Rnd.':'Round','Pos.':'Position','Nationality[n 1]':'Nationality'
df = pd.read_html(draft2018)[3].rename(columns=d)
print(df.head())
Round Pick Player Position Nationality \
0 1 1 Deandre Ayton C Bahamas
1 1 2 Marvin Bagley III PF United States
2 1 3 Luka Dončić PG/SF Slovenia
3 1 4 Jaren Jackson Jr. PF United States
4 1 5 Trae Young PG United States
Team School / club team
0 Phoenix Suns Arizona (Fr.)
1 Sacramento Kings Duke (Fr.)
2 Atlanta Hawks (traded to Dallas)[a] Real Madrid (Spain)
3 Memphis Grizzlies Michigan State (Fr.)
4 Dallas Mavericks (traded to Atlanta)[a] Oklahoma (Fr.)
【讨论】:
为什么是索引[3]? @MohitMotwani - 它是数据帧列表中的 4.DataFrame @MohitMotwani - 完全正确。 哦,有道理。谢谢!【参考方案2】:只是为了演示问题,尝试打印您的行:
print(row)
第一个列表将打印为空,这就是引发错误的原因。数据框需要 7 个值,但您提供的值为零。尽管 Jezrael 的解决方案更优雅,但您可以进行此更改以使其正常工作:
draft2018 ="https://en.wikipedia.org/wiki/2018_NBA_draft"
draftpage =urllib.request.urlopen(draft2018)
soup=bs.BeautifulSoup(draftpage,"html.parser")
columns = ['Round', 'Pick', 'Player', 'Position',
'Nationality', 'Team', 'School/club team']
df = pd.DataFrame(columns=columns)
table = soup.find("table","class":"wikitable sortable plainrowheaders").tbody
print(table)
trs = table.find_all("tr")
for tr in trs:
tds = tr.find_all('td')
row = [td.text.replace('\n','') for td in tds]
if len(row) < 7:
continue
# print(row)
df = df.append(pd.Series(row, index=columns), ignore_index=True)
【讨论】:
以上是关于使用 BS4 进行网页抓取 - “传递值的长度为 0,索引意味着 7”的主要内容,如果未能解决你的问题,请参考以下文章
使用 BS4 或 Selenium 从 finishline.com 抓取网页
“AttributeError:‘str’对象没有属性‘descendants’错误,使用 bs4 和 selenium 进行自动抓取