Красивый суп - результаты в CSV для всех элементов в списках - PullRequest
1 голос
/ 22 сентября 2019

Приведенный ниже фрагмент «работает», но выводит только первую запись в CSV.Я пытаюсь заставить его выводить один и тот же вывод, но для каждого пистолета в списке URL-адресов пистолетов в списке all_links.

Любое изменение, которое я внес в него, с отпечатками для вывода (просто дляувидеть, как он работает) печатает тот же результат

или, если я создаю список gun_details и пытаюсь его распечатать, получаю один и тот же вывод элемента.

Как бы я распечатал все метки gun_detailsи охватывает в CSV?

import csv
import urllib.request

import requests
from bs4 import BeautifulSoup

all_links = []


url = "https://www.guntrader.uk/dealers/minsterley/minsterley-ranges/guns?page={}"
for page in range(1, 3):
    res = requests.get(url).text
    soup = BeautifulSoup(res, "html.parser")
    for link in soup.select(
        'a[href*="dealers/minsterley/minsterley-ranges/guns/shotguns/"]'
    ):
        all_links.append("https://www.guntrader.uk" + link["href"])

for a_link in all_links:

    gun_label = []
    gun_span = []

    res = urllib.request.urlopen(a_link)
    # res = requests.get(a_link)
    soup = BeautifulSoup(res, "html.parser")
    for gun_details in soup.select("div.gunDetails"):
        for l in gun_details.select("label"):
            gun_label.append(l.text.replace(":", ""))
        for s in gun_details.select("span"):
            gun_span.append(s.text)

my_dict = dict(zip(gun_label, gun_span))
with open("mycsvfile.csv", "w") as csvfile:
    writer = csv.DictWriter(csvfile, fieldnames=None)
    for key in my_dict.keys():
        csvfile.write(f"{key},{my_dict[key]}\n")

1 Ответ

1 голос
/ 22 сентября 2019

Попробуйте запустить среднюю часть следующим образом:

for a_link in all_links:
    gun_label = []
    gun_span = []

    res = requests.get(a_link)
    soup = bs(res.content, 'html.parser') #note it's 'res.content', not just 'res'
    for gun_details in soup.select('div.gunDetails'):
        for l in gun_details.select('label'):
            gun_label.append(l.text.replace(':',''))
    for s in gun_details.select('span'):
        gun_span.append(s.text)

    #this block is now indented differently - it's INSIDE the 'for' loop
    my_dict = dict(zip(gun_label, gun_span))
    with open('mycsvfile.csv', 'a') as csvfile:
        writer = csv.DictWriter(csvfile, fieldnames=None)
        for key in my_dict.keys():
            csvfile.write(f"{key},{my_dict[key]}\n")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...