Python 靓汤,列表索引超出范围
我查看了站点html源代码,找到了我需要的Python 靓汤,列表索引超出范围,python,python-3.x,parsing,web-scraping,beautifulsoup,Python,Python 3.x,Parsing,Web Scraping,Beautifulsoup,我查看了站点html源代码,找到了我需要的namePlayer,它是4列和“a”标记。我试图在答案中找到它。用'namePlayer':cols[3]追加。a.text 但当我完成它时,我得到了索引器。然后我尝试将索引改为2,3,4,5,但什么也没有 问题:为什么我得到索引器错误:当一切正常时,列表索引超出范围(我认为:D) 资料来源: #!/usr/bin/env python3 import re import urllib.request from bs4 import Beautifu
namePlayer
,它是4列和“a”标记。我试图在答案中找到它。用'namePlayer':cols[3]追加。a.text
但当我完成它时,我得到了索引器。然后我尝试将索引改为2,3,4,5,但什么也没有
问题:为什么我得到索引器错误:当一切正常时,列表索引超出范围(我认为:D)
资料来源:
#!/usr/bin/env python3
import re
import urllib.request
from bs4 import BeautifulSoup
class AppURLopener(urllib.request.FancyURLopener):
version = "Mozilla/5.0"
def get_html(url):
opener = AppURLopener()
response = opener.open(url)
return response.read()
def parse(html):
soup = BeautifulSoup(html)
table = soup.find(id='answers')
answers = []
for row in table.find_all('div')[16:]:
cols = row.find_all('div')
answers.append({
'namePlayer': cols[3].a.text
})
for answer in answers:
print(answers)
def main():
parse(get_html('http://jaze.ru/forum/topic?id=50&page=1'))
if __name__ == '__main__':
main()
听起来确实像是在提供一个列表元素不存在的索引。记住索引从0开始。示例:0,1,2,3。因此,如果我请求元素10,我将得到一个索引错误。在循环期间,您正在覆盖cols
。cols
的最后一个长度为零,因此出现错误
for row in table.find_all('div')[16:]:
cols = row.find_all('div')
print(len(cols))
运行上述命令,您将看到cols
的长度为0
这也可能发生在循环中的其他地方,所以您应该测试长度,并决定是否需要更新逻辑。此外,您还需要说明是否存在子标记
例如,您可以执行以下操作(bs4.7.1+必需):
请注意,answers
已正确缩进,因此您正在使用每个cols
值。这可能不适合您的确切用例,因为我不确定您想要的结果是什么。如果您声明所需的输出,我将相应地更新
编辑:
戏院
from bs4 import BeautifulSoup as bs
import requests
r = requests.get('https://jaze.ru/forum/topic?id=50&page=1')
soup = bs(r.content, 'lxml')
answer_blocks = soup.select('[id^=answer_]')
names = [i.text.strip() for i in soup.select('[id^=answer_] .left-side a')]
unique_names = {i.text.strip() for i in soup.select('[id^=answer_] .left-side a')}
您可以使用OrderedDict(该问答中的其他解决方案)保留订单并消除重复
为什么使用for循环查找所有div标记:
for row in table.find_all('div')[16:]:
cols = row.find_all('div')
通过使用这个,你得到了所有你想要的标签
cols = table.find_all('div')[16:]
因此,只要用这个代码更改代码,您就得到了答案。再次检查cols
是什么。显然,它没有4个元素。它有4个元素。它不能,否则不会导致错误。确保您试图获取的数据不在其他结构(如外部列表或字典)中;(.我想在网站上找到每个答案的PlayerName。请您提供这些PlayerName的示例,这些示例应该会出现。'namePlayer':VANTY3'namePlayer':KK#キング 'namePlayer':回忆。等等所有回答这个主题的人的昵称。谢谢!它很有效,我得到了我想要的。但是我不明白他是如何对这些名字排序的,是随机的吗?列表将按正确的顺序排列。集合没有顺序(唯一)。你可以改为在循环中消除重复。
for row in table.find_all('div')[16:]:
cols = row.find_all('div')
cols = table.find_all('div')[16:]