Python 刮纸器问题[简单]:TypeError:类型为'的对象;非类型';没有len()

Python 刮纸器问题[简单]:TypeError:类型为'的对象;非类型';没有len(),python,web-scraping,beautifulsoup,python-requests,screen-scraping,Python,Web Scraping,Beautifulsoup,Python Requests,Screen Scraping,我试着写一个简单的pythonwebscraper,代码在上面,webscraper只包含这么多代码。运行后,我收到一个错误,上面写着: TypeError:类型为“NoneType”的对象没有len() 我不知道哪里不对 --更新-- 我将“return r.next”改为“return r.content” 它会生成以下错误: 索引器:列表索引超出范围 我也不知道为什么。看起来getHTMLText()中有输入错误-请尝试将return r.next替换为return r.text您的问题来

我试着写一个简单的pythonwebscraper,代码在上面,webscraper只包含这么多代码。运行后,我收到一个错误,上面写着:

TypeError:类型为“NoneType”的对象没有len()

我不知道哪里不对

--更新--

我将“return r.next”改为“return r.content”

它会生成以下错误:

索引器:列表索引超出范围


我也不知道为什么。

看起来
getHTMLText()
中有输入错误-请尝试将
return r.next
替换为
return r.text

您的问题来自这一行:

soup=BeautifulSoup(html,“html.parser”)
初始化
BeautifulSoup
类时的
TypeError
告诉我们,BeautifulSoup试图对非类型对象执行
len
操作,但无法执行。因此,作为
html
参数(即第一个位置参数)传入的数据是
NoneType
而不是html文档

那么,为什么HTML是非类型的?从
getHTMLText
函数到达的,特别是以下行:

返回r.next

对于您在main中提供的URL,返回None。行
r=requests.get()
返回一个
requests.Response
对象,并从该
中返回一个
返回一个“PreparedRequest,如果重定向链中有下一个请求,则返回一个”。-即不是HTML元素。您可能希望将该行更新为:

返回r.content

依照

以下是一些旁注:

  • 如果在
    getHTMLText
    中捕获到异常,您将返回一个空字符串,而不是HTML,因此我认为初始化
    BeautifulSoup
    时也会出错
  • 捕获一揽子异常通常不是一个好主意——更好的方法是捕获在这种情况下提出的特定预期异常,并允许所有其他异常失败。见:
  • 单字母变量名通常很难在调试器中使用,因为某些字符已经使用了,我建议您保留
    r
    变量,通常避免使用单字符变量名,因为在开始使用调试器时,这将使您的生活更轻松:)

  • 我看到了
    叫回地狱
    。编写所有这些回调函数只会给自己带来困难。如果很简单,那就保持简单。所谓的
    回调地狱
    也很难为其他人调试!你什么意思?叫回地狱,叫回地狱是什么?我是个新手。请解释清楚!新手也很难理解!当您创建相互调用的嵌套函数时,它们被称为
    callbackhell
    。几个相互调用的嵌套函数使调试变得困难。对于一个简单的刮刀,我不会使用函数方法!我真的不会称之为“回拨地狱”,它的风格实际上是很好和干净的——每个小功能只做一项工作。这些函数不是嵌套的——它们是不同的,它们也不是相互调用的——main依次调用它们。真的看不出有什么问题!非常感谢你的帮助!但是,我尝试将“return r.next”更改为“return r.content”,它会生成以下错误:indexer:list index超出范围。我不知道为什么。你能帮我再看一下吗?我认为这仍然是因为数组没有长度?np:)您的问题在这一行-`ulist.append([aaa[0].string])`代码假设aaa是非空列表,如果aaa是空列表会发生什么?你需要处理这个问题。BTW如果这有助于解决这个问题,请考虑接受我的答案:
    import requests
    from bs4 import BeautifulSoup
    
    def getHTMLText(url):
        try:
            r = requests.get(url, timeout=30)
            r.raise_for_status() # generate error information
            r.encoding = r.apparent_encoding # could be revised to enhance the speed
            return r.next # return the HTML to other parts of the programmme
        except:
            return ""
    
    def fillUnivKust(ulist, html):
        soup = BeautifulSoup(html, "html.parser")
        for a in soup.find('li').children:
            if isinstance(a, bs4.element.Tag): # avoid String type's data
                aaa = a('div') # There are only 2 divs here in this case
                ulist.append([aaa[0].string]) # aaa[0] -> Product's name
    
    def printUnivList(ulist, num):
        for i in range(num):
            u = ulist[i] # u already have
            print(u[i]) # print the ith product's name
    
    def main():
        uinfo = []
        url = 'https://www.cattelanitalia.com/en/products?c=new'
        html = getHTMLText(url)
        fillUnivKust(uinfo, html)
        printUnivList(uinfo, 25)
    
    main()