python - 当代码命中缺失值时如何修复 Web 抓取 Python 代码 "IndexError: list index out of range"

标签 python web-scraping beautifulsoup jupyter-notebook

我正在编写网页抓取代码。该代码适用于第一页和后续页面,但是当出现不同的容器时会遇到问题。问题是,对于大多数容器,class="date"包含两个变量(用户 [0] 的条目数和日期 [1]),但是,当匿名用户发帖时,它仅显示日期 [0] 。由于代码旨在查找第二个条目,因此由于“IndexError:列表索引超出范围”而在此停止

我尝试创建一个 if 循环,但由于我是初学者,所以它不起作用。有什么办法可以解决这个问题吗?

from bs4 import BeautifulSoup as soup
from urllib.request import urlopen as uReq
from random import randint
from time import sleep
from requests import get

out_filename = "Repromeda.csv"
headers = "text,user_name,date \n"
f = open(out_filename, "w")
f.write(headers)

pages = [str(i) for i in range(1,20)]

for page in pages:
    response = get('https://www.emimino.cz/diskuse/1ivf-repromeda-56566/strankovani/'+ page)
    sleep(randint(5,10))

    #opening up connection, grabing the page
    page_soup = soup(response.text, 'html.parser')
    #grabs each container
    containers = page_soup.findAll("div",{"class":"discussion_post"})

    for container in containers:
        text1 = container.div.p
        text = text1.text.replace('\n', ' ')

        user_container = container.div.b
        user_id = user_container.text

        date_container = container.findAll("span",{"class":"date"})
        date = date_container[1].text



        print("text: " + text + "\n" )
        print("user_id: " + user_id + "\n")
        print("date: " + date + "\n")
        # writes the dataset to file
        f.write(text.replace(",", "|") + ", " + user_id + ", " + date + "\n")

f.close()

最佳答案

使用 bs4 4.7.1 +(不知道早期版本),您可以访问 :last-child 伪选择器。您可以使用它来确保始终获得容器内具有类 date 的最后一个元素(无需担心索引)

for container in containers:
        text1 = container.div.p
        text = text1.text.replace('\n', ' ')

        user_container = container.div.b
        user_id = user_container.text

        date = container.select_one('.date:last-child').text

        print("text: " + text + "\n" )
        print("user_id: " + user_id + "\n")
        print("date: " + date)

关于python - 当代码命中缺失值时如何修复 Web 抓取 Python 代码 "IndexError: list index out of range",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57779146/

相关文章:

python - 将函数应用于列表递归的每个元素

java - 如何使用 Jython 执行 if 语句

java - 优化 : Oj algorithms (java) versus SCIP (python)

python - 无法从每次单击时激活的类似容器的盒子中解析信息

python - 使用 python 和 bs4 进行网页抓取

python - 尽管 id 存在,Python 中的 Beautiful Soup 找不到 id

python - 将交叉表值与数据框连接起来?

python - 在一个网页上抓取多个单独的表格

python - 使用 BeautifulSoup Python 拉取相邻的表格单元格

python - 如何修复来自数据库的 Python 请求/BeautifulSoup 响应