Невозможно объединить 2 списка с помощью Python (Int и текстовые списки) и разбить выходные данные на отдельные файлы - PullRequest
0 голосов
/ 31 октября 2018

У меня проблема с объединением данных из 2 списков. У меня есть номер страницы (целочисленное значение) и данные таблицы (текстовое значение) в списке при объединении их для вывода на печать. Я получаю эту ошибку:

TypeError: объект типа 'int' не имеет len ()

Моя цель состоит в том, чтобы напечатать следующий вывод, а также нужна помощь для сохранения данных из таблицы 3 на основе ключевого слова «Идентификатор воздушного судна» в имя таблицы «Таблица 3 A» и данных со значением заголовка «Идентификатор установки» в имя таблицы » Таблица 3 I "в 2 отдельных вкладках файла Excel. Мой код указан ниже:

import time
import requests
import random
from lxml import html  # used to use Xpath
from bs4 import BeautifulSoup
import xlsxwriter

def append_row(ws, row):
    for col, value in enumerate(row):
        ws.write_string(ws.cur_row, col, value)
    ws.cur_row += 1

workbook = xlsxwriter.Workbook('Output.xlsx')
ws_3_A = workbook.add_worksheet("Table 3 A")
ws_3_I = workbook.add_worksheet("Table 3 I")

# Keep a track of the row to use in each worksheet
ws_3_A.cur_row = 0  
ws_3_I.cur_row = 0   

# Code starts from here:
start = 1 
end = 3 
link = "http://ec.europa.eu/environment/ets/ohaDetails.do?returnURL=&languageCode=en&accountID=&registryCode=&buttonAction=all&action=&account.registryCode=&accountType=&identifierInReg=&accountHolder=&primaryAuthRep=&installationIdentifier=&installationName=&accountStatus=&permitIdentifier=&complianceStatus=&mainActivityType=-1&searchType=oha&resultList.currentPageNumber={}&nextList=Next%C2%A0%3E&selectedPeriods="

for page_number in range(start, end):
    print("Page {}".format(page_number))
    url = link.format(page_number)
    r = requests.get(url)
    print(url)

    serial_no = [int(x) for x in str(page_number)]
    print(serial_no)

    time.sleep(random.randint(2, 5))
    soup = BeautifulSoup(r.content, "lxml")

    # Table 3 Aircraft Operator ID data:
    for items in soup.find(id="tblChildDetails").find("table").find_all("tr")[1:]:
        dataset = [item.get_text(strip=True) for item in items.find_all("td")[:]]
        print(dataset)
        append_row(ws_3_A, serial_no + [url] + dataset)

    # Table 3 Installation ID data:
    for items in soup.find(id="tblChildDetails").find("table").find_all("tr")[1:]:
        dataset = [item.get_text(strip=True) for item in items.find_all("td")[:]]
        print(dataset)
        append_row(ws_3_I, serial_no + [url] + dataset)
workbook.close()  

Текущие и ожидаемые результаты прилагаются в виде скриншота. Ожидаемый результат: enter image description here

Traceback:

Traceback (most recent call last):
  File "D:\QRS\Script.py", line 42, in <module>
    append_row(ws_3_A, serial_no + [url] + dataset)
  File "D:\QRS\Script.py", line 10, in append_row
    ws.write_string(ws.cur_row, col, value)
  File "C:\Users\varun\AppData\Roaming\Python\Python36\site-packages\xlsxwriter\worksheet.py", line 67, in cell_wrapper
    return method(self, *args, **kwargs)
  File "C:\Users\varun\AppData\Roaming\Python\Python36\site-packages\xlsxwriter\worksheet.py", line 500, in write_string
    return self._write_string(row, col, string, cell_format)
  File "C:\Users\varun\AppData\Roaming\Python\Python36\site-packages\xlsxwriter\worksheet.py", line 512, in _write_string
    if len(string) > self.xls_strmax:
TypeError: object of type 'int' has no len()

1 Ответ

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

Каждый элемент в [int(x) for x in str(page_number)] должен быть строкой. Потому что каждый элемент перейдет к переменной value в функции append_row().

И затем, если вы хотите получить ожидаемый результат, вам нужно игнорировать первый tr, когда page_number больше start.

Используйте try...finally, чтобы вы могли закрыть книгу, когда произошла ошибка скрипта

import time
import requests
import random
from lxml import html
from bs4 import BeautifulSoup
import xlsxwriter

def append_row(ws, row):
    for col, value in enumerate(row):
        ws.write_string(ws.cur_row, col, value)
    ws.cur_row += 1

workbook = xlsxwriter.Workbook('Output.xlsx')


def ws_3(name):
    return workbook.add_worksheet("Table 3 {}".format(name))


# Code starts from here:
start = 1 
end = 5
link = "http://ec.europa.eu/environment/ets/ohaDetails.do?returnURL=&languageCode=en&accountID=&registryCode=&buttonAction=all&action=&account.registryCode=&accountType=&identifierInReg=&accountHolder=&primaryAuthRep=&installationIdentifier=&installationName=&accountStatus=&permitIdentifier=&complianceStatus=&mainActivityType=-1&searchType=oha&resultList.currentPageNumber={}&nextList=Next%C2%A0%3E&selectedPeriods="
coldict = {}
try:
    for page_number in [1,2,3,342,343]:
        print("Page {}".format(page_number))
        url = link.format(page_number)
        r = requests.get(url)

        serial_no = [str(page_number)]

        time.sleep(random.randint(2, 5))
        soup = BeautifulSoup(r.content, "lxml")

        # Table 3 Aircraft Operator ID data:
        tr = soup.find(id="tblChildDetails").find("table").find_all("tr")
        dataset = [item.get_text(strip=True) for item in tr[1].find_all("td")]

        #select or create new table
        if not coldict.get(dataset[0]):
            ws = ws_3(dataset[0])
            ws.cur_row = 0
            coldict[dataset[0]] = ws
            append_row(ws, ["Page no","Url"] + dataset)
        else:
            ws = coldict.get(dataset[0])

        for items in tr[2:]:
            dataset = [item.get_text(strip=True) for item in items.find_all("td")]
            print(url)
            print(dataset)
            append_row(ws, serial_no + [url] + dataset)

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