Проблемы с захватом HTML-переменной с использованием Python Scraping - PullRequest
0 голосов
/ 08 июня 2018

Этот код предназначен для очистки переменных данных с веб-сайта и вывода значений.Я пытаюсь использовать это, чтобы я мог график цен на видеокарты с течением времени.

Я использую Beautifulsoup, и все работает, за исключением того, что я не могу получить цену для правильной печати. ​​

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

my_url = "https://www.newegg.ca/Product/ProductList.aspx?Submit=ENE&N=100007708%20601210955%20601203901%20601294835%20601295933%20601194948&IsNodeId=1&bop=And&Order=BESTSELLING&PageSize=96"

uClient = uReq(my_url)
page_html = uClient.read()
uClient.close()

page_soup = soup(page_html, "html.parser")

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

filename = "GPU Prices.csv"
f = open(filename, "w")

header = "Price,Product Brand,Product Name,Shipping Cost\n"

f.write(header)

for container in containers:
    price_container = container.findAll("li", {"class":"price-current"})
    price = price_container[0].text.strip()

    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()

    price
    f.write(price.replace(",", "") + "," + brand.replace(",", ".") + "," +  product_name.replace(",", " |") + "," +  shipping + "\n")

f.close()

После запуска CSV-файл выглядит следующим образом:

CSV output format

1 Ответ

0 голосов
/ 08 июня 2018

Я предлагаю использовать библиотеку Python CSV, чтобы помочь с написанием вашего файла.Объект csv.writer(), имеющий список элементов, автоматически добавляет запятые между вашими элементами, и если какой-либо элемент содержит запятую, он автоматически заключает запись в кавычки (что является правильным способом обработки).После этого файл будет загружен правильно.

Кроме того, ваша переменная price нуждается в небольшом обрезании, поскольку она содержит ряд конечных символов, которые необходимо сначала удалить.

from urllib.request import urlopen as uReq
from bs4 import BeautifulSoup as soup
import csv

my_url = "https://www.newegg.ca/Product/ProductList.aspx?Submit=ENE&N=100007708%20601210955%20601203901%20601294835%20601295933%20601194948&IsNodeId=1&bop=And&Order=BESTSELLING&PageSize=96"

uClient = uReq(my_url)
page_html = uClient.read()
uClient.close()

page_soup = soup(page_html, "html.parser")
containers = page_soup.findAll("div",{"class":"item-container"})
filename = "GPU Prices.csv"
header = ['Price', 'Product Brand', 'Product Name', 'Shipping Cost']

with open(filename, 'w', newline='') as f_output:
    csv_output = csv.writer(f_output)
    csv_output.writerow(header)

    for container in containers:
        price_container = container.findAll("li", {"class":"price-current"})
        price = price_container[0].text.replace('\xa0', ' ').strip(' –\r\n|')

        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()

        csv_output.writerow([price, brand, product_name, shipping])

GivingВы GPU Prices.csv начинаете как:

Price,Product Brand,Product Name,Shipping Cost
"$1,079.99 (5 Offers)",ASUS,ASUS ROG GeForce GTX 1080 Ti DirectX 12 STRIX-GTX1080TI-O11G-GAMING 11GB 352-Bit GDDR5X PCI Express 3.0 HDCP Ready Video Card,$4.99 Shipping
$794.99 (5 Offers),ASUS,ASUS ROG GeForce GTX 1080 STRIX-GTX1080-A8G-GAMING 8GB 256-Bit GDDR5X PCI Express 3.0 HDCP Ready Video Card,$4.99 Shipping

Посмотрите, как цена во второй строке не содержит запятой, поэтому не заключена в кавычки.Это правильно и будет корректно обрабатываться таким приложением, как Excel.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...