【问题标题】:How to add a condition to an Error:NoneType' object has no attribute 'text'.?如何向错误添加条件:NoneType' 对象没有属性'text'。?
【发布时间】:2021-05-13 22:29:42
【问题描述】:

帮助

如果没有“文本”,我一直试图跳过错误,但我所做的任何尝试都没有奏效。所以我有点担心,我是这个代码世界的新手,但是当总是有“文本”要提取时,这段代码是有效的。

有人可以告诉我把条件放在哪里吗? :/

import  requests
import pandas as pd

baseUrl = "https://www.sodimac.cl"

headers = {
    'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36'
}

productlinks =[]

for x in range(1,7):
    r = requests.get(f"https://www.sodimac.cl/sodimac-cl/category/scat922339/Ceramicas?currentpage={x}")
    soup = BeautifulSoup(r.content, 'lxml')
    productlist = soup.find_all('div', class_='jsx-3663142191 search-results-products-container')
    for item in productlist:
        for link in item.find_all('a', id="title-pdp-link", href=True):
            productlinks.append(baseUrl + link['href'])

Ceramicaslist = []
for  link in productlinks:
    r = requests.get(link)
    soup = BeautifulSoup(r.content, 'lxml')
    name = soup.find('div', class_='jsx-4129468047 product-brand').text.strip()
    descripcion = soup.find('h1', class_='jsx-4129468047 product-title').text.strip()
    modelo = soup.find('div', class_='jsx-4129468047 product-model').text.strip()
    SKU = soup.find('div', class_='jsx-4129468047 product-cod').text.strip()
    precio = soup.find('span', class_='jsx-3655512908').text.strip()

    Ceramicas = {
        'name': name,
        'descripcion': descripcion,
        'modelo': modelo,
        'SKU': SKU,
        'precio': precio
}

Ceramicaslist.append(Ceramicas)
print('Saving: ', Ceramicas['name'], Ceramicas['descripcion'], Ceramicas['modelo'],Ceramicas['SKU'], Ceramicas['precio'])
    
df = pd.DataFrame(Ceramicaslist)
print(df)
df.to_csv('CeramicasSodimac.csv')**strong text**```

【问题讨论】:

    标签: python-3.x pandas web-scraping


    【解决方案1】:

    class_= 参数中删除jsx-XXXX 部分:

    import requests
    import pandas as pd
    from bs4 import BeautifulSoup
    
    baseUrl = "https://www.sodimac.cl"
    
    headers = {
        "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36"
    }
    
    productlinks = []
    
    for x in range(1, 7):
        r = requests.get(
            f"https://www.sodimac.cl/sodimac-cl/category/scat922339/Ceramicas?currentpage={x}"
        )
        soup = BeautifulSoup(r.content, "lxml")
        productlist = soup.find_all(
            "div", class_="search-results-products-container"
        )
        for item in productlist:
            for link in item.find_all("a", id="title-pdp-link", href=True):
                productlinks.append(baseUrl + link["href"])
    
    Ceramicaslist = []
    for link in productlinks:
        r = requests.get(link)
        soup = BeautifulSoup(r.content, "lxml")
        name = soup.find("div", class_="product-brand").text.strip()
        descripcion = soup.find("h1", class_="product-title").text.strip()
        modelo = soup.find("div", class_="product-model").text.strip()
        SKU = soup.find("div", class_="product-cod").text.strip()
        precio = soup.find("div", class_="price").span.text.strip()
    
        Ceramicas = {
            "name": name,
            "descripcion": descripcion,
            "modelo": modelo,
            "SKU": SKU,
            "precio": precio,
        }
    
        Ceramicaslist.append(Ceramicas)
        print(
            "Saving: ",
            Ceramicas["name"],
            Ceramicas["descripcion"],
            Ceramicas["modelo"],
            Ceramicas["SKU"],
            Ceramicas["precio"],
        )
    
    df = pd.DataFrame(Ceramicaslist)
    print(df)
    df.to_csv('CeramicasSodimac.csv', index=False)
    

    打印:

    Saving:  Cordillera Cerámica café 45x45 cm 2,08 m2 Modelo Lato Código 2184680 $5.990
    Saving:  Cordillera Cerámica beige 45,3x45,3 2,05 m2 Modelo Grava Código 4213564 $6.990
    Saving:  Holztek Cerámica Muro blanco 20x30 cm 1,5 m2 Modelo Blanco Código 1791893 $4.990
    Saving:  Scop Cerámica café 33x33 cm 1,96 m2 Modelo Canelo Código 4213483 $4.290
    Saving:  Scop Cerámica gris 33x33 cm 1,96 m2 Modelo Granito Código 421367X $4.590
    Saving:  Cordillera Cerámica 45x45 cm adoquín gris 2,08 m2 Modelo Adoquín Código 6401317 $6.490
    Saving:  Cordillera Ceramica miel 60x60 cm 1,44 m2 Modelo Legno Código 3099318 $8.890
    Saving:  Cordillera Cerámica multicolor 45x45 cm 2,08 m2 Modelo Madera Murcia Código 309930X $7.290
    Saving:  Cordillera Cerámica 45x45 cm adoquín beige 2,08 m2 Modelo Adoquín Código 6401309 $7.990
    Saving:  Bs Cerámica Muro gris 20x30 cm 1,5 m2 Modelo Carla Código 1004395 $7.990
    Saving:  Holztek Cerámica café 53x53 cm 2,29 m2 Modelo Laminato Código 2669188 $8.790
    Saving:  Scop Cerámica café 45,3x45,3 cm 2,05 m2 Modelo Canelo Código 4213505 $5.690
    Saving:  Cordillera Cerámica café 45,3x45,3 cm 2,05 m2 Modelo Nogal Código 4213513 $6.990
    Saving:  Cordillera Cerámica multicolor 45x45 cm 2,08 m2 Modelo Limari Código 3099237 $5.990
    Saving:  Holztek Cerámica café 45x45 cm 2 m2 Modelo HD Rustico Código 2742322 $6.490
    Saving:  Cordillera Cerámica 34x34 parma gray 1,66 m2 Modelo PARMA Código 6448267 $7.490
    Saving:  Bs Fachaleta Muro 30x60 grafito 1,53 m2 Modelo CERLAJ36000 Código 3664864 $12.990
    
    
    ...and so on.
    

    【讨论】:

    • precio = soup.find('div', class_="price").span.text.strip()AtributeError 中出现错误:'NoneType' 对象没有属性'span' 但是在第一个数据中工作,因此如果你知道一个简单的方法来跳过错误呵呵但是谢谢,汗水变化几乎全部(我正在努力,但第一次在这里问4help)学习
    • 脚本运行良好。我刚刚测试了@Esteban García。
    • if soup.find("div", class_="product-model"): modelo = soup.find("div", class_="product-model").text.strip() else: modelo = "" #或者没有解决!谢谢
    【解决方案2】:

    soup.find() 如果没有匹配则返回 None,因此您需要考虑这一点。使用 if 和 try 块有很多方法可以做到这一点。我可能会这样做:

    def safe_text(el): return el.text.strip() if el else "n/a"
    

    那么你可以:

    name = safe_text(soup.find('div', class_='jsx-4129468047 product-brand'))
    

    【讨论】:

    • if soup.find("div", class_="product-model"): modelo = soup.find("div", class_="product-model").text.strip()否则: modelo = "" #or none 。我终于做到了,在另一篇文章中看到 stackoverflow.com/questions/54799306/… THANKS
    猜你喜欢
    • 2019-07-18
    • 1970-01-01
    • 2023-03-03
    • 1970-01-01
    • 2019-01-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多