Перепрыгивание через элементы, которые не имеют одинаковый тег HTML во время webscraping - PullRequest
0 голосов
/ 26 марта 2020

В настоящее время я пытаюсь сэкономить процент между двумя разными ценами. Код HTML для первого элемента, который я хочу webscrap:

<li class="price-save">
    <span class="price-save-endtime price-save-endtime-current"></span>
    <span class="price-save-endtime price-save-endtime-another" style="display:none;"></span>
    <span class="price-save-label">Save: </span>
    <span class="price-save-dollar"></span>
    <span class="price-save-percent">22%</span>   <----------------------I WANT THIS ONE!
</li>

Для этого я кодировал следующее в Python:

try:
    percentage = soup.find('span',class_='price-save-percent').get_text()
except:
    print("Not found")

Однако, когда Я печатаю результаты в файл .csv, если следующий элемент веб-сайта не содержит%, затем копирует результат, пока не найдет следующий элемент с процентом. Для лучшего понимания, пожалуйста, смотрите URL: https://www.newegg.com/Laptops-Notebooks/SubCategory/ID-32?Tid=6740

Вы можете видеть, что первый элемент имеет % Save, второй также, но третий нет. В файле .csv третий элемент получает% сохраненного от второго. Это случается до сих пор. Вместо этого я хотел бы иметь только пустую ячейку.

1 Ответ

1 голос
/ 26 марта 2020

Вам необходимо обработать условие NA для каждого элемента в списке. Для этого вам нужно быть в сетке только с соответствующими элементами div. Приведенный ниже код выполняет всю работу и сохраняет все цены, сохраненные в списке, если доступно, еще добавляет NA -:

import bs4
from urllib.request import urlopen as req
from bs4 import BeautifulSoup as soup
import csv
#Link de la pàgina on farem webscraping
url = 'https://www.newegg.com/Laptops-Notebooks/SubCategory/ID-32?Tid=6740'

#Obrim una connexió amb la pàgina web
Client = req(url)
#Offloads the content of the page into a variable
pagina = Client.read()
#Closes the client
Client.close()
#html parser
pagina_soup=soup(pagina,"html.parser")
#grabs each product
productes = pagina_soup.findAll("div",{"class":"item-container"})

 #Obrim un axiu .csv
#Capçaleres del meu arxiu .csv
result_file = open("ordinadors.csv",'a',encoding='utf-8',newline='')
 #Escrivim la capçalera
head = ["Marca","Producte","PreuActual","PreuAnterior","CostEnvio","Rebaixa"]
writing_csv = csv.DictWriter(result_file, fieldnames=head)
writing_csv.writeheader()

#Fem un loop sobre tots els productes
for producte in productes:

    #Agafem la marca del producte
    marca_productes = producte.findAll("div",{"class":"item-info"})
    marca = marca_productes[0].div.a.img["title"]

    #Agafem el nom del producte
    name = producte.a.img["title"] 

    #Preu Actual
    actual_productes = producte.findAll("li",{"class":"price-current"})
    preuActual = actual_productes[0].strong.text

    #Preu anterior    
    try:
        #preuAbans = producte.find("li", class_="price-was").next_element.strip()
        preuAbans = producte.find('span',class_='price-was-data').get_text()
        percentage = producte.find('span',class_='price-save-percent').get_text()
    except:
        preuAbans = "NA"
        percentage = "NA"

    #Agafem els costes de envio
    costos_productes = producte.findAll("li",{"class":"price-ship"})
    #Com que es tracta d'un vector, agafem el primer element i el netegem.
    costos = costos_productes[0].text.strip()  

    #Writing the file
    writing_csv.writerow({"Marca": marca, "Producte": name, "PreuActual": preuActual, "PreuAnterior": preuAbans,"CostEnvio":costos,"Rebaixa":percentage})

result_file.close()  
...