【发布时间】: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])
“列”变量应该是一个列表,我知道这是因为:
print(columns)给了我用方括号和逗号括起来的多个 HTML 列表(因为 for 循环)。print(len(columns))返回“9”,表示每行有9列,这可以通过维基百科页面中的列数来确认。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