Анализатор python, который я использую для вставки информации о странице в базу данных MySQL, дает пустую таблицу. Что не так с моим кодом? - PullRequest
0 голосов
/ 04 мая 2020

В настоящее время у меня есть контрольно-пропускной пункт с парсером python, который я должен использовать для извлечения информации с веб-сайта, который отслеживает случаи COVID-19 в штате Мичиган. Парсер использует библиотеку XML Dom Minidom из python и работает как положено, но когда я go вставляю информацию в базу данных MySQL, он не дает результатов, а вместо этого имеет пустую таблицу. Я не уверен, что не так с моим кодом, и я пробовал несколько вещей, в том числе:

  • Преобразование списка, в котором хранятся очищенные данные, в кортеж
  • Цикл по списку и выполнение оператора вставки ... и других незначительных настроек безрезультатно. Таблица должна содержать название округа, подтвержденные случаи и подтвержденные случаи смерти в таком формате:

+ -------------- + --- ------------- + ----------------- +

| countyName | подтвержденные случаи | подтвержденные смерти |

+ -------------- + ---------------- + --------- -------- +

Может кто-нибудь помочь мне?

Вот файл, parser.py:

import sys
import xml.dom.minidom
import MySQLdb
document = xml.dom.minidom.parse(sys.argv[1])
tableElements = document.getElementsByTagName('table')

db = MySQLdb.connect(
      host="localhost",
      user="root",
      passwd="root",
      db="temp"
)

curr = db.cursor()

curr.execute("CREATE DATABASE IF NOT EXISTS cases")
curr.execute("USE cases")
query = "CREATE TABLE IF NOT EXISTS casesBreakdown (countyName varchar(255), confirmedCases INT, confirmedDeaths INT, newCases INT, newDeaths INT)"
curr.execute(query)

#for tr in tableElements[1].getElementsByTagName('tr'):
for tr in tableElements[0].getElementsByTagName('tr'):
      data = []
      for td in tr.getElementsByTagName('td'):
      for node in td.childNodes:
              if node.nodeType == node.TEXT_NODE:
                  data.append(node.nodeValue)
      x = ",".join(data)
      test = []
      for case in x.split(","):
          test.append(case)
      #print(test)
sql = "INSERT INTO casesBreakdown (countyName, confirmedCases, confirmedDeaths) VALUES (%s, %s, %s)"
curr.executemany(sql, test)

db.commit()

А вот ссылка на страница, которую я преобразовал в x html, используя tagoup, который я передаю в командной строке arg: https://pastebin.com/JU8cDJJ5

Любая помощь будет высоко ценится. Спасибо!

1 Ответ

0 голосов
/ 04 мая 2020

Теперь это сработает, и я оставлю вам окончательную отладку.
Одна проблема заключалась в том, что вы слишком часто переинициализировали test = [].
Кроме того, .executemany() ожидает что-то вроде списка кортежей; просто список не сработает.
Другая проблема могла бы быть с отступом, но трудно сказать, было ли это при расшифровке кода для SO.

test = []
for tr in tableElements[0].getElementsByTagName('tr'): 
    data = [] 
    for td in tr.getElementsByTagName('td'): 
        for node in td.childNodes:   
            if node.nodeType == node.TEXT_NODE: 
                data.append(node.nodeValue) 
            t = tuple(data) 
            if len(t) == 3: 
                test.append(t) 
...