Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/356.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_Web Scraping_Beautifulsoup_Jupyter Notebook - Fatal编程技术网

“如何修复网页抓取Python代码”;索引器:列表索引超出范围“;当代码命中缺少的值时

“如何修复网页抓取Python代码”;索引器:列表索引超出范围“;当代码命中缺少的值时,python,web-scraping,beautifulsoup,jupyter-notebook,Python,Web Scraping,Beautifulsoup,Jupyter Notebook,我正在编写一个网页抓取代码。代码在第一个页面和随后的页面上运行良好,但是当出现不同的容器时会遇到问题。问题在于,对于大多数容器,class=“date”包含两个变量(来自用户[0]的条目数和日期[1]),但是,当匿名用户发布时,它只显示日期[0]。由于代码旨在查找第二个条目,因此由于“IndexError:list index out range”而停止 我曾尝试创建一个if循环,但由于我是一个初学者,所以没有成功。有没有办法解决这个问题 从bs4导入BeautifulSoup作为汤 从urll

我正在编写一个网页抓取代码。代码在第一个页面和随后的页面上运行良好,但是当出现不同的容器时会遇到问题。问题在于,对于大多数容器,class=“date”包含两个变量(来自用户[0]的条目数和日期[1]),但是,当匿名用户发布时,它只显示日期[0]。由于代码旨在查找第二个条目,因此由于“IndexError:list index out range”而停止

我曾尝试创建一个if循环,但由于我是一个初学者,所以没有成功。有没有办法解决这个问题

从bs4导入BeautifulSoup作为汤
从urllib.request导入urlopen作为uReq
从随机导入randint
从时间上导入睡眠
从请求导入获取
out\u filename=“Repromeda.csv”
headers=“文本、用户名、日期\n”
f=打开(文件名为“w”)
f、 写入(标题)
pages=[str(i)表示范围(1,20)内的i]
对于页面中的页面:
响应=获取('https://www.emimino.cz/diskuse/1ivf-repromeda-56566/strankovani/"(附页)
睡眠(randint(5,10))
#打开连接,抓住页面
page_soup=soup(response.text'html.parser')
#抓住每个容器
containers=page_soup.findAll(“div”,{“class”:“discussion_post”})
对于集装箱中的集装箱:
text1=container.div.p
text=text1.text.replace('\n','')
user\u container=container.div.b
user\u id=user\u container.text
date_container=container.findAll(“span”,{“class”:“date”})
日期=日期\容器[1]。文本
打印(“文本:“+text+”\n”)
打印(“用户id:+用户id+”\n)
打印(“日期:“+date+”\n”)
#将数据集写入文件
f、 写入(text.replace(“,”,“|”)+“,“+用户id+”,“+日期+”\n”)
f、 关闭()
因为代码是为了寻找第二个条目而设计的,所以它停在这里 由于“索引器:列表索引超出范围”,我尝试创建 一个if循环,但由于我是初学者,它不起作用

您是否仅在日期[1]存在时才尝试捕获它?在这种情况下,您可以将查询封装在一个简单的try-catch块中:

try:
    date = date_container[1].text
except IndexError:
    date = "Not Available"
因为代码是为了寻找第二个条目而设计的,所以它停在这里 由于“索引器:列表索引超出范围”,我尝试创建 一个if循环,但由于我是初学者,它不起作用

您是否仅在日期[1]存在时才尝试捕获它?在这种情况下,您可以将查询封装在一个简单的try-catch块中:

try:
    date = date_container[1].text
except IndexError:
    date = "Not Available"

由于即使用户是匿名的,日期仍然可用,因此仍然可以使用except子句捕获日期

试试看:
日期=日期\容器[1]。文本
除索引器外:
日期=日期\u容器[0]。文本

由于即使用户是匿名的,日期仍然可用,因此您仍然可以使用except子句捕获日期

试试看:
日期=日期\容器[1]。文本
除索引器外:
日期=日期\u容器[0]。文本
使用bs4 4.7.1+(不知道以前的版本)您可以访问
:最后一个子项
伪选择器。您可以使用它来确保始终在容器中获得类为
date
的最后一个元素(而不必担心索引)

使用bs4 4.7.1+(不知道早期版本),您可以访问
:最后一个子项
伪选择器。您可以使用它来确保始终在容器中获得类为
date
的最后一个元素(而不必担心索引)


您应该注意这一点,并进行嵌套的尝试&except,以防date=date\u容器[0]。文本也无效。我查看了网站,每当有匿名用户时,日期总是存储在date\u容器[0]中。您应该注意这一点,并进行嵌套的尝试&except,以防date=date\u容器[0].text也是无效的。我查看了网站,每当有匿名用户时,日期总是存储在日期容器中[0]