Скопируйте информацию из нескольких URL-адресов, перечисленных в CSV, с помощью BeautifulSoup, а затем экспортируйте эти результаты в новый файл CSV. - PullRequest
0 голосов
/ 20 февраля 2020

У меня есть CSV-файл с 45k + строками, каждый из которых содержит свой путь в одном и том же домене, которые структурно идентичны друг другу, и каждый из них доступен для клика. Мне удалось использовать BeautifulSoup для очистки заголовка и содержимого каждого из них, и с помощью функции print я смог проверить скребок. Тем не менее, когда я пытаюсь экспортировать собранную информацию в новый файл CSV, я получаю только название и описание улицы последнего URL, а не все, как я ожидал.

from bs4 import BeautifulSoup
import requests
import csv

with open('URLs.csv') as csvfile:
    reader = csv.DictReader(csvfile)
    for row in reader:
        site = requests.get(row['addresses']).text
        soup = BeautifulSoup(site, 'lxml')
        StreetName = soup.find('div', class_='hist-title').text
        Description = soup.find('div', class_='hist-content').text
with open('OutputList.csv','w', newline='') as output:
    Header = ['StreetName', 'Description']
    writer = csv.DictWriter(output, fieldnames=Header)

    writer.writeheader()
    writer.writerow({'StreetName' : StreetName, 'Description' : Description})

Как можно вывести CSV иметь в каждой строке название улицы и описание для соответствующей строки URL во входном CSV-файле?

1 Ответ

0 голосов
/ 20 февраля 2020

Вам нужно открыть оба файла на одном уровне, а затем читать и писать на каждой итерации. Примерно так:

from bs4 import BeautifulSoup
import requests
import csv

with open('URLs.csv') as a, open('OutputList.csv', 'w') as b:

    reader = csv.reader(a)

    writer = csv.writer(b, quoting=csv.QUOTE_ALL)
    writer.writerow(['StreetName', 'Description'])

    # Assuming url is the first field in the CSV
    for url, *_ in reader:
        r = requests.get(url)
        if r.ok:
            soup = BeautifulSoup(r.text, 'lxml')
            street_name = soup.find('div', class_='hist-title').text.strip()
            description = soup.find('div', class_='hist-content').text.strip()
            writer.writerow([street_name, description])

Надеюсь, это поможет.

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