Вставить динамические данные в MySQL с Python - PullRequest
0 голосов
/ 01 сентября 2018

РЕДАКТИРОВАНИЕ >>>>>

Я пишу некоторый код, который возвращает два выхода, но появляется ошибка.

В чем основная проблема моего кода?

from urllib.request import urlopen as uReq
from bs4 import BeautifulSoup as soup
import os
import sys
import codecs
from urllib.request import urlopen
import pymysql
import mysql.connector

for i in range(1): #electronic

    my_url = "https://www.xxxxx.com/mobile_phones/?facet_is_mpg_child=0&viewType=gridView&page="

    uClient = uReq(my_url + str(i))

    page_html = uClient.read()

    uClient.close()

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

    containers = page_soup.findAll("div" , {"class" : "sku -gallery" })

    for container in containers:

        name = container.img["alt"]

        title_container = container.findAll("span", {"class" : "brand"})

        Brand = title_container[0].text

        price = container.findAll("span",{"class" : "price"} )

        price_one = price[0].text.strip()

        price_old = container.findAll("span",{"class" : "price -old "})
        price_two = '0'
        if len(price_old) > 0:
            price_two = price_old[0].text.strip()

        rank = container.findAll("span",{"class" : "rating-aggregate"})
        ranking = 'N/A'
        if len(rank) > 0:
            ranking = rank[0].text.strip()

conn = pymysql.connect(host="localhost",user="root",passwd="",db="prod")
x = conn.cursor()
#name1 = name()
#brand1 = Brand()
#price_one1 = price_one1()
#price_two1= price_one1()
#rank1 = rank()

x.execute("INSERT INTO list (productname,brand,price1,price2,rank) VALUES (%s,%s,%s,%s.%s)" , (name,Brand,price_one,price_two,ranking))
conn.commit()
conn.close()

C: \ Users \ хххх \ AppData \ Local \ Programs \ Python \ Python35 \ python.exe C: /Users/xxxx/.PyCharm2018.2/config/scratches/bd.py Traceback (большинство последний звонок последний): File «C: /Users/xxxx/.PyCharm2018.2/config/scratches/bd.py», строка 54, в x.execute («INSERT INTO list (название продукта, бренд, цена1, цена2, ранг) VALUES (% s,% s,% s,% s.% s)», (имя, бренд, price_one, price_two, рейтинг))
файл "C: \ Users \ хххх \ AppData \ Local \ Programs \ Python \ Python35 \ Lib \ сайт-пакеты \ pymysql \ cursors.py", строка 170, в исполнении result = self._query (query) Файл "C: \ Users \ xxxx \ AppData \ Local \ Programs \ Python \ Python35 \ lib \ site-packages \ pymysql \ cursors.py", строка 328, в _query conn.query (q) Файл "C: \ Users \ xxxx \ AppData \ Local \ Programs \ Python \ Python35 \ lib \ site-packages \ pymysql \ connections.py", строка 516, в запросе Файл self._affered_rows = self._read_query_result (небуферизованный = небуферизованный) "C: \ Users \ хххх \ AppData \ Local \ Programs \ Python \ Python35 \ Lib \ сайт-пакеты \ pymysql \ connections.py", строка 727, в _read_query_result Файл result.read () "C: \ Users \ xxxx \ AppData \ Local \ Programs \ Python \ Python35 \ lib \ site-packages \ pymysql \ connections.py", строка 1066, в чтении first_packet = self.connection._read_packet () Файл "C: \ Users \ xxxx \ AppData \ Local \ Programs \ Python \ Python35 \ lib \ site-packages \ pymysql \ connections.py", строка 683, в _read_packet packet.check_error () Файл "C: \ Users \ xxxx \ AppData \ Local \ Programs \ Python \ Python35 \ lib \ site-packages \ pymysql \ protocol.py", строка 220, в check_error err.raise_mysql_exception (self._data) Файл "C: \ Users \ xxxx \ AppData \ Local \ Programs \ Python \ Python35 \ lib \ site-packages \ pymysql \ err.py", строка 109, в Raise_mysql_exception поднять errorclass (errno, errval) pymysql.err.ProgrammingError: (1064, «У вас ошибка в синтаксисе SQL; обратитесь к руководству, которое соответствует вашей версии сервера MariaDB для правильного использования синтаксиса около '.'2') 'в строке 1 ")

Процесс завершен с кодом выхода 1

Ответы [ 2 ]

0 голосов
/ 01 сентября 2018

Этот код хранит информацию в файле CSV, но теперь мне нужно сохранить ее в MySQL.

from urllib.request import urlopen as uReq
from bs4 import BeautifulSoup as soup
import os
import sys
import unicodecsv as csv
import codecs
from urllib.request import urlopen


for i in range(3): #electronic

    my_url = "https://www.xxxx.com/mobile_phones/?facet_is_mpg_child=0&viewType=gridView&page="

    uClient = uReq(my_url + str(i))

    page_html = uClient.read()

    uClient.close()

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

    containers = page_soup.findAll("div" , {"class" : "sku -gallery" })

    filename = "mobile.csv"
    f = codecs.open(filename, "a" , "utf-8-sig")
    headers = "name, Brand, price_one, price_two, ranking\n"
    f.write(headers)


    for container in containers:

        name = container.img["alt"]

        title_container = container.findAll("span", {"class" : "brand"})

        Brand = title_container[0].text

        price = container.findAll("span",{"class" : "price"} )

        price_one = price[0].text.strip()

        price_old = container.findAll("span",{"class" : "price -old "})
        price_two = 0
        if len(price_old) > 0:
            price_two = price_old[0].text.strip()

        rank = container.findAll("span",{"class" : "rating-aggregate"})
        if len(rank) > 0:
            ranking = rank[0].text.strip()

        print("name " + name)
        print("Brand "+ Brand)
        print("price_one " + price_one)
        print("price_two {}".format(price_two))  #----> 
        print("ranking " + ranking)

        f.write(name + "," + Brand.replace(",", "|") + "," + price_one.replace(",", "") + "," + price_two.replace(",", "") + "," + ranking + "\n")

f.close()
0 голосов
/ 01 сентября 2018

Проблема с переменной rank. Вы должны пройти ranking, но вы как-то пропустили. по указанному вами коду,

rank = container.findAll("span",{"class" : "rating-aggregate"}) # resultset
if len(rank) > 0:
    ranking = rank[0].text.strip() #result

Итак, изменение

x.execute("INSERT INTO list (productname,brand,price1,price2,rank) VALUES (%s,%s,%s,%s.%s)" , (name,Brand,price_one,price_two,ranking))

и вы готовы к работе! У меня есть несколько предложений для вас. если вы используете if условие, всегда указывайте условие else или значение по умолчанию для переменной, объявленной в условном выражении. В противном случае вы можете оказаться в ошибке при сбое условия. Как,

rank = container.findAll("span",{"class" : "rating-aggregate"})
ranking = rank[0].text.strip() if len(rank) > 0 else 'N/A'

Или,

rank = container.findAll("span",{"class" : "rating-aggregate"})
ranking = 'N/A'
if len(rank) > 0:
    ranking = rank[0].text.strip()

Ура!

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