Сохранение в CSV в столбцы по разделам из импорта CSV - PullRequest
0 голосов
/ 25 февраля 2020

Я новичок в Python, и мне удалось собрать сценарий вместе, но я борюсь с записью в CSV, несмотря на то, что много об этом читал.

Мой сценарий (ниже) сканирует список импортированных URL-адресов (страниц для сканирования) и считывает все абзацы (теги p), которые находятся внутри раздела, который имеет класс 'holder'. Всего разделов 4 'holder'.

Я хочу записать вывод в CSV, где 'section' - заголовок столбца, а каждый 'paragraph' образует соответствующую строку.

Возможно ли это?

Вот мой сценарий:

from urllib.request import urlopen
from bs4 import BeautifulSoup
import pandas
import csv

filename = "results.csv"
csv_writer = csv.writer(open(filename, 'w'))

contents = []
with open('list.csv','r') as csvf: # Open file in read mode
    urls = csv.reader(csvf)
    for url in urls:
    contents.append(url) # Add each url to list contents         

p = [[],[],[],[]]

for url in contents: 
    page = urlopen(url[0]).read()
    soup = BeautifulSoup(page, "lxml")
    n = 0

    for container in soup.find_all("section", {'class':'holder whyuse'}): # 
Ignore this section.
        container.decompose()

    for container in soup.find_all("section", {'class':'holder centertc'}): # 
Ignore this section.
        container.decompose()

    for container in soup.find_all("section",attrs={'class': 'holder'}):

        print('==','Section',n+1,'==')
        for paragraph in container.find_all("p"):
            p[n].append(paragraph)
            print(paragraph)
        n += 1

w = pandas.DataFrame(p).transpose()
w.columns=['Section 1','Section 2','Section 3','Section 4']
w.to_csv(results.csv)

, который в настоящее время выводит 4 раздела с абзацами для каждого раздела, в то время как я хочу, чтобы сформировался print('==','Section',n,'==') заголовки столбцов CSV и print(paragraph) для генерации значений ячеек в каждом столбце.

Полагаю, мне нужна некоторая форма группировки для создания 4 разделов с соответствующими абзацами и экспорта в CSV. .

Пример вывода из текущего скрипта при извлечении 2 х URL-адресов из импорта:

== Section 1 ==
<p>This is paragraph one in section one from the first url.</p>
<p>This section one has another paragraph here too in the first url.</p>
<p>Finally a third paragraph in section one of the first url.</p>
== Section 2 ==
<p>This is paragraph one in section two of the first url and only has one paragraph.</p>
== Section 3 ==
<p>This is the first paragraph in section 3 of the first url.</p>
<p>Section three in the first url has a second paragraph.</p>
== Section 4 ==
<p>Section four also only has one paragraph in the first url.</p>
== Section 1 ==
<p>This is the first paragraph in the second url.</p>
<p>The second url only has two paragraphs in section one.</p>
== Section 2 ==
<p>This is a paragraph in section two of the second url.</p>
<p>This is the second paragraph in section two of the second url.</p>
== Section 3 ==
<p>Section 3 in the second url only has one paragraph and this is it.</p>
== Section 4 ==
<p>This is the first paragraph in section four of the second url.</p>
<p>Section four of the second url also has this second paragraph.</p>
<p>Section four of the second url has three paragraphs.</p>

Таким образом, для CSV нужны 4 заголовка столбца (Раздел 1, Раздел 2, Раздел 3, Раздел 4) и каждому столбцу нужны соответствующие абзацы, например, столбец «Раздел 1» будет заполнен:

Col 1 / Section 1 - Row 1:
<p>This is paragraph one in section one from the first url.</p><p>This section one has another paragraph here too in the first url.</p><p>Finally a third paragraph in section one of the first url.</p>

Col 1 / Section 1 - Row 2:
<p>This is the first paragraph in the second url.</p><p>The second url only has two paragraphs in section one.</p>

Col 2 / Section 2 - Row 1:
<p>This is paragraph one in section two of the first url and only has one paragraph.</p>

Col 2 / Section 2 - Row 2:
<p>This is a paragraph in section two of the second url.</p>
<p>This is the second paragraph in section two of the second url.</p>

Et c et c

1 Ответ

1 голос
/ 27 февраля 2020
p = [[],[],[],[]]

for url in contents: 
    page = urlopen(url[0]).read()
    soup = BeautifulSoup(page, "lxml")
    n = 0

    for container in soup.find_all("section",attrs={'class': 'holder'}):

        print('==','Section',n+1,'==')
        for paragraph in container.find_all("p"):
            p[n].append(paragraph)
            print(paragraph)
        n += 1

w = pandas.DataFrame(p).transpose()
w.columns=['Section 1','Section 2','Section 3','Section 4']
w.to_csv(csvname)
...