Не могу распечатать мой скребок и записать результаты соответственно

Я написал скрипт на Python для очистки некоторого содержимого с веб-страницы. Парсер хорошо справляется с анализом данных. Есть два поля для очистки name и data, каждое из которых содержит списки элементов. Однако, когда я распечатываю его, результат становится беспорядочным, потому что на данный момент я не могу распечатать их должным образом.

Это то, что я пробовал до сих пор:

import requests, csv
from bs4 import BeautifulSoup

LINK = 'http://active.boeing.com/doingbiz/d14426/geoprocess.cfm?ProcessCode=000&pageID=m20487&Country=AllLocations&State='

def get_item(url):
    res = requests.get(url).text
    soup = BeautifulSoup(res,"lxml")
    name = [item.find_next_sibling().text for item in soup.select("strong")]
    table = soup.select('table[cellspacing="1"]')[0]
    for items in table.select("tr")[1:]:
        data = [item.get_text(strip=True) for item in items.select("td")]

        print(name,data)  #this is where I need to twitch the code to get them printed like how it should be

        with open("itemresults.csv","a",newline="") as infile:
            writer = csv.writer(infile)
            writer.writerow(name,data)  #I can't write them like so but if I try like [name,data] this the results are messy

if __name__ == '__main__':
    get_item(LINK)

Для ясности: список в переменной name должен быть распечатан один раз, но они печатаются в соответствии со списками в переменной data.

As they are big enough to show how the expected result look like, I'm trying with a demo:
"1,2,3" are within "name".


I wish to get them printed like below:

1 2 3   q w e
        a s d
        c x r

They are printed like the following instead:

1 2 3   q w e
1 2 3   a s d
1 2 3   c x r

Итог:

1. I wish to get them printed accordingly and
2. Write in a csv file in the right way
['000', '000', 'Boeing Information Only', 'Boeing Info Only', 'Boeing Information Only'] ['AUSTRIA', '', 'BE10410486', 'MAGNA STEYR'] ['CHINA', '', 'BE10409781', 'FESHER AVIATION COMPONENTS ZHENJIANG CO LTD'] ['CHINA', '', 'BE10050454', 'SHENYANG AIRCRAFT CORP'] это какой вывод вы хотите?
toheedNiaz 11.04.2018 12:30

См. Редактирование. Спасибо.

SIM 11.04.2018 12:39

добавьте фиксированный код, посмотрите, хотите ли вы этого

toheedNiaz 11.04.2018 12:42

Спасибо @ toheedNiaz за ваш ответ. Дело в том, что мне нравится размещать содержимое name и data рядом, а не последовательно, как я пытался показать выше. Спасибо.

SIM 11.04.2018 12:51

эти данные не будут иметь смысла в файле CSV. вы проверили сгенерированный файл csv?

toheedNiaz 11.04.2018 12:54

Тот, который вы предложили ниже, я уже пробовал, прежде чем создавать этот пост. Еще раз спасибо.

SIM 11.04.2018 13:01

пожалуйста, проверьте обновленный код

toheedNiaz 11.04.2018 13:08

Позвольте нам продолжить обсуждение в чате.

toheedNiaz 11.04.2018 13:36
0
8
60
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Если я правильно понял ваш вопрос, вы хотите, чтобы имя было заголовком или заголовком вашего CSV-файла, и его следует добавлять только один раз в CSV-файл, а также в распечатки.

Проблема с вашим кодом:

у вас есть name в цикле for, который будет печатать имя каждый раз, когда цикл выполняется, так же, как и в случае записи в файл csv.

Фиксированный код

import requests, csv
from bs4 import BeautifulSoup

LINK = 'http://active.boeing.com/doingbiz/d14426/geoprocess.cfm?ProcessCode=000&pageID=m20487&Country=AllLocations&State='

def get_item(url):
    res = requests.get(url).text
    soup = BeautifulSoup(res,"lxml")
    name = [item.find_next_sibling().text for item in soup.select("strong")]
    spaces = len(" ".join(itm for itm in name))*"  "
    table = soup.select('table[cellspacing="1"]')[0]
    for idx, items in enumerate(table.select("tr")[1:]):
        data = [item.get_text(strip=True) for item in items.select("td")]
        if idx == 0:
            print(name,data)  #this is where I need to twitch the code to get them printed like how it should be
        else:
            print(spaces,data)
        with open("itemresults.csv","a",newline="") as infile:
            writer = csv.writer(infile)
            if idx == 0 :

                writer.writerow([name,data])  #I can't write them like so but if I try like [name,data] this the results are messy
            else:
                writer.writerow([spaces,data])  #I can't write them like so but if I try like [name,data] this the results are messy

if __name__ == '__main__':
    get_item(LINK)

Выход

['000', '000', 'Boeing Information Only', 'Boeing Info Only', 'Boeing Information Only'] ['AUSTRIA', '', 'BE10410486', 'MAGNA STEYR']
                                                                                                                                                 ['CHINA', '', 'BE10409781', 'FESHER AVIATION COMPONENTS ZHENJIANG CO LTD']
                                                                                                                                                 ['CHINA', '', 'BE10050454', 'SHENYANG AIRCRAFT CORP']
                                                                                                                                                 ['GERMANY', '', 'BE10364235', 'AERO COATING GMBH']
                                                                                                                                                 ['GERMANY', '', 'BE10022527', 'BFG FEINGUSS NIEDERRHEIN GMBH']
                                                                                                                                                 ['GERMANY', '', 'BE10394502', 'MT AEROSPACE AG']
                                                                                                                                                 ['GERMANY', '', 'BE10341261', 'XPERION GMBH & CO KG']
                                                                                                                                                 ['GERMANY', '', 'BE10023472', 'ZOLLERN ALUMINIUMFEINGUSS SOEST GMBH & CO KG']
                                                                                                                                                 ['INDIA', '', 'BE10387428', 'ADVANCED METALLURGICAL LAB']
                                                                                                                                                 ['MEXICO', '', 'BE10404178', 'MONTERREY AEROSPACE MEXICO']
                                                                                                                                                 ['NETHERLANDS', '', 'BE10334331', 'PM AEROTEC']
                                                                                                                                                 ['UNITED STATES', 'AL', 'BE10039892', 'GENERAL DYNAMICS OTS DRI INC']
                                                                                                                                                 ['UNITED STATES', 'CA', 'BE10059366', 'CANYON COMPOSITES INC']
                                                                                                                                                 ['UNITED STATES', 'CA', 'BE10031203', 'GENERAL VENEER MFG  CO']
                                                                                                                                                 ['UNITED STATES', 'CA', 'BE10038216', 'SAI INDUSTRIES']
                                                                                                                                                 ['UNITED STATES', 'CA', 'BE10277597', 'SANTIER INC']
                                                                                                                                                 ['UNITED STATES', 'CA', 'BE10053288', 'TIODIZE CO INC']
                                                                                                                                                 ['UNITED STATES', 'CA', 'BE10273067', 'VALLEY DESIGN & MFG INC']
                                                                                                                                                 ['UNITED STATES', 'CT', 'BE10054071', 'KAMAN PRECISION PRODUCTS']
                                                                                                                                                 ['UNITED STATES', 'FL', 'BE10361256', 'BAY TECH INDS INC']
                                                                                                                                                 ['UNITED STATES', 'FL', 'BE10067537', 'TRIUMPH AEROSTRUCTURES VOUGHT AIRCRAFT DIVISION']
                                                                                                                                                 ['UNITED STATES', 'FL', 'BE10278251', 'URS LABORATORIES DIVISION']
                                                                                                                                                 ['UNITED STATES', 'GA', 'BE10055356', 'WARNER ROBINS AIR LOGISTICS COMPLEX']
                                                                                                                                                 ['UNITED STATES', 'MD', 'BE10069970', 'ALLIANT TECHSYSTEMS OPERATIONS LLC']
                                                                                                                                                 ['UNITED STATES', 'MO', 'BE10030518', 'ESSEX INDUSTRIES INC']
                                                                                                                                                 ['UNITED STATES', 'OH', 'BE10032670', 'HDI LANDING GEAR USA']
                                                                                                                                                 ['UNITED STATES', 'OH', 'BE10408922', 'ORBIT NDT BEDFORD']
                                                                                                                                                 ['UNITED STATES', 'TX', 'BE10034905', 'AERO COMPONENTS INC']
                                                                                                                                                 ['UNITED STATES', 'UT', 'BE10026661', 'OGDEN AIR LOGISTICS COMPLEX']

этот код создаст желаемый файл csv Надеюсь это поможет

Я приму твой ответ. Однако взгляните на решение (я уже предоставил), которого я ожидал.

SIM 11.04.2018 13:49

Это то самое решение, которое я ожидал получить:

import requests, csv
import itertools
from bs4 import BeautifulSoup

LINK = 'http://active.boeing.com/doingbiz/d14426/geoprocess.cfm?ProcessCode=000&pageID=m20487&Country=AllLocations&State='

def get_item(url):
    res = requests.get(url).text
    soup = BeautifulSoup(res,"lxml")
    name = [item.find_next_sibling().text for item in soup.select("strong")]
    spaces = len(name)*" "
    table = soup.select('table[cellspacing="1"]')[0]
    for idx, items in enumerate(table.select("tr")[1:]):
        data = [item.get_text(strip=True) for item in items.select("td")]
        if idx == 0:
            list_of_tuples = [name,data]

        else:
            list_of_tuples = [spaces,data]

        item_name = list(itertools.chain(*list_of_tuples))
        with open("itemresults.csv","a",newline="") as infile:
            writer = csv.writer(infile)
            writer.writerow(item_name)  

if __name__ == '__main__':
    get_item(LINK)

Чтобы увидеть результаты, запустите его.

Другие вопросы по теме