Обновите значения до MySQL с помощью Python - PullRequest
0 голосов
/ 01 апреля 2020

final_result содержит три URL-адреса, с которых я извлекаю данные, эти три извлеченные числа должны быть обновлены в три строки в столбце trg.

Приведенный ниже код несколько работает, но проблема в том, что он обновляет все три строки с данными из первого URL вместо url1 в row1, url2 в row2 et c.

test = []
for url in final_result:
    sauce = urllib.request.urlopen(url)
    soup = BeautifulSoup(sauce, 'lxml')

    trg = soup.find_all('span', attrs={'class':'someClass'})
    for ind in trg:
        insert = re.sub('<[^>]*>', '', str(ind))
        test.append(insert)
        print(type(test))
        print(test)

    for values in test:
         cursor.execute("UPDATE my_table SET trg=%s", (values,))
         connection.commit()
connection.close()

Результаты из print(type(test))

<class 'list'>

Результаты print(test)

['118\xa0732\xa0173']
['118\xa0732\xa0173', '676\xa0595']
['118\xa0732\xa0173', '676\xa0595', '314\xa0541']

Текущая работа над вторым раствором Натаниэля Ф

test = trg
for i in range(len(final_result)):
    url = final_result[i]
    for url in final_result:
        sauce = urllib.request.urlopen(url)
        soup = BeautifulSoup(sauce, 'lxml')
    for ind in oms:
        insert = re.sub('<[^>]*>', '', str(trg[i]))
        test[i] = insert
    cursor.execute("UPDATE my_table SET trg=%s", (test))
    connection.commit()
connection.close()

1 Ответ

0 голосов
/ 01 апреля 2020

Похоже, что ваша ошибка вызвана обновлением test без его сброса.

Каждый раз, когда вы перебираете l oop, он добавляет в массив больше значений и в конечном итоге присваивает больше MySQL может использовать, следовательно, not all parameters were used in the SQL statement.

Что касается того, почему обновляются все три столбца, похоже, что это, вероятно, вызвано попыткой обновить весь столбец каждый раз, когда требуется отдельное значение изменилось. Я бы предложил использовать WHERE в вашем выражении SQL только для обновления ячейки, которую нужно изменить, что выглядело бы примерно так (мой MySQL немного ржавый, но общая идея):

    UPDATE trg
    FROM my_table
    WHERE primary_key = %s # row_index
    SET trg = %s # updated value

Другой вариант - сохранить значения в test за пределами l oop для URL-адресов и обновить его один раз для пары URL / индекс, а затем выполнить существующий запрос SQL в обновить весь столбец сразу:

    ...
    test = trg
    for i in range(len(final_result)):
        url = final_result[i]
        ...
        insert = re.sub('<[^>]*>', '', str(trg[i]))
        test[i] = insert
    ...
    cursor.execute("UPDATE my_table SET trg=%s", (test))
    ...

Визуальное представление трех методов:


    Original Column: ABC
    Result Column: XYZ

    Original Implementation:
    ABC --X-> "Set ABC = XBC" --Y-> "Set XBC = XYC" --Z-> "Set XYC = XYZ"

    SQL Change Using WHERE:
    ABC --X-> "Set A = X" --> XBC --Y-> "Set B = Y" --> XYC --Z-> "Set C = Z" --> XYZ

    Change Using Moved SQL:
    Database Values:
        ABC --X-> ABC --Y-> ABC --Z-> ABC --> "Set ABC = XYZ"
    Local Variable:
        ABC --X-> "Set A = X" --> XBC --Y-> "Set B = Y" --> XYC --Z-> "Set C = Z" --> XYZ

...