Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/333.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 靓汤,列表索引超出范围_Python_Python 3.x_Parsing_Web Scraping_Beautifulsoup - Fatal编程技术网

Python 靓汤,列表索引超出范围

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

我查看了站点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 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:]