【问题标题】:'NoneType' object is not subscriptable when webscraping image title网络抓取图像标题时,“NoneType”对象不可下标
【发布时间】:2021-10-07 05:09:08
【问题描述】:
url2 = 'https://www.newegg.ca/Desktop-Graphics-Cards/SubCategory/ID-48?Tid=7708'

# opening up connection, grabbing page
uclient = ureq(url2)
html = uclient.read()
uclient.close()


# html parsing
page_soup = soup(html, "html.parser")

#grabs each product
containers = page_soup.findAll("div",{"class":"item-container"})

print(containers[0].div.div.a.img["title"])

for container in containers:
    brand = container.div.div.a.img["title"]
    title_container = container.findAll("a", {"class":"item-title"})
    product_name = title_container[0].text
    shipping_container = container.findAll("li", {"class":"price-ship"})
    shipping = shipping_container[0].text.strip()
    print(brand)
    print(product_name)
    print(shipping)

问题出现在for循环brand = container.div.div.a.img["title"] 它给了我错误“NoneType”对象不可下标。奇怪的是我可以访问这个标题,甚至可以在循环之外打印它print(containers[0].div.div.a.img["title"])请帮我弄清楚这里发生了什么。谢谢,一切顺利!

【问题讨论】:

  • 在没有运行代码的情况下,我的猜测是这个问题发生在第零个元素以外的元素上,换句话说,containers[i] 代表i != 0。检查containers 中的所有元素是否实际上具有“结构”div.div.a.img["title"]
  • 在循环的哪个迭代中抛出该错误?
  • 我使用for number, container in enumerate(containers): print('---', number, '---') ... 来查看哪个迭代出现问题,它给了我containers[15] 的错误。您应该使用if/else 检查container.div.div.a.img 是否提供None 并跳过此元素。

标签: python web-scraping


【解决方案1】:

使用

for number, container in enumerate(containers):  
    print("---", number, "---") 
    # ... code ...

我发现它只对containers[15] 产生问题。

您应该使用if/else 来检查container.div.div.a.img 是否提供None 并跳过此元素或设置一些默认文本。

    if container.div.div.a.img:
        brand = container.div.div.a.img["title"]
    else:
        brand = "???"

完整的工作代码

from bs4 import BeautifulSoup as soup
from urllib.request import urlopen as ureq

url2 = 'https://www.newegg.ca/Desktop-Graphics-Cards/SubCategory/ID-48?Tid=7708'

# opening up connection, grabbing page
uclient = ureq(url2)
html = uclient.read()
uclient.close()

# html parsing
page_soup = soup(html, "html.parser")

#grabs each product
containers = page_soup.findAll("div", {"class":"item-container"})

#print(containers[15].div.div.a.img["title"])

for number, container in enumerate(containers):
    print("---", number, "---")

    if container.div.div.a.img:
        brand = container.div.div.a.img["title"]
    else:
        brand = "???"

    title_container = container.findAll("a", {"class": "item-title"})
    product_name = title_container[0].text

    shipping_container = container.findAll("li", {"class": "price-ship"})
    shipping = shipping_container[0].text.strip()

    print(brand)
    print(product_name)
    print(shipping)

编辑:

我查看网页以查看此containers[15],它有额外的div 和文本#1 BEST SELLER,这会产生问题。它需要不同的方法来获取它 - 即。

    brand = container.div.find("img", {"title": True})["title"]

您甚至可以将它与所有容器一起使用

for number, container in enumerate(containers):
    print("---", number, "---")

    #if container.div.div.a.img:
    #    brand = container.div.div.a.img["title"]
    #else:
    #    brand = "???"
        
    brand = container.div.find('img', {"title": True})["title"]
        
    product_name = container.find("a", {"class": "item-title"}).text
    shipping = container.find("li", {"class": "price-ship"}).text.strip()

    print(brand)
    print(product_name)
    print(shipping)

【讨论】:

    猜你喜欢
    • 2019-07-12
    • 1970-01-01
    • 2013-09-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-10
    相关资源
    最近更新 更多