【问题标题】:Why am I getting "list index out of range"?为什么我得到“列表索引超出范围”?
【发布时间】:2020-06-04 03:15:37
【问题描述】:

我对 Python 还是很陌生,我有一个 Python 函数,它应该从 Wikipedia 页面 (https://en.wikipedia.org/wiki/List_of_largest_cities_of_U.S._states_and_territories_by_population) 获取 HTML,并且,出于这个问题的目的,在每个页面的第一列中获取 HTML排。我正在使用 Python 和 BeautifulSoup4。

def getStates():
page = requests.get("https://en.wikipedia.org/wiki/List_of_largest_cities_of_U.S._states_and_territories_by_population")
soup = BeautifulSoup(page.text, "html.parser")

table = soup.find("tbody") 
rows = table.findAll("tr")

for row in rows:
    columns = row.findAll("td")
    print(columns[0])

“列”变量应该是一个列表,我知道这是因为:

  1. print(columns) 给了我用方括号和逗号括起来的多个 HTML 列表(因为 for 循环)。

  2. print(len(columns))返回“9”,表示每行有9列,这可以通过维基百科页面中的列数来确认。

  3. findAll() 函数返回一个列表,如 BS4 文档中所示:https://www.crummy.com/software/BeautifulSoup/bs4/doc/#find-all

但是,如果我执行print(columns[0]) 或任何索引,则会收到以下错误:IndexError: list index out of range。那么,有人可以告诉我我做错了什么吗?我觉得我在这里犯了一个明显的错误,但尝试搜索这个问题并没有产生任何结果。

【问题讨论】:

  • 因为columns是一个空列表...大概是因为该行没有td标签
  • 就像我说的,如果我执行“print(len(columns))”,它会返回 9,这意味着列表不为空。
  • 啊,废话。你是对的。出于某种原因,第一个列表是空的,我是个白痴,谢谢。我确实花了几个小时在这个问题上,所以这很尴尬。谢谢!
  • @juanpa.arrivillaga 我知道已经有一段时间了,但请随时将您的评论作为答案,我会接受。

标签: python web-scraping beautifulsoup


【解决方案1】:

我有一个列表列表,但正如 @juanpa.arrivillaga 所说,我没有意识到第一个列表(索引 0 中)是空的。

【讨论】:

    猜你喜欢
    • 2023-02-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-04
    • 2017-12-26
    相关资源
    最近更新 更多