Python: написать CSV с данными из нескольких вложенных для цикла - PullRequest
0 голосов
/ 04 января 2019

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

import requests 
from bs4 import BeautifulSoup
from csv import writer

with open ("full_links_details.csv", 'w', newline='') as csv_file: 
    csv_writer = writer(csv_file)
    csv_writer.writerow(["Details", "Details_Link", "image_link"])

    z = """
         <div class="container container1">
           <ul class="splist-view">
               <li class="wow fadeInUp">
                   <div class="row">
                       <div class="pic">
                           <a href="some_link_a">
                               <img src="some_image_link_a">
                           </a>
                       </div>
                       <div class="detail">
                           <ul>
                               <li class="hd"><a href="some_link_a">SomeTitleText-A</a></li>
                           </ul>
                       </div>
                   </div>
               </li>

               <li class="wow fadeInUp">
                   <div class="row">
                       <div class="pic">
                           <a href="some_link_b">
                               <img src="some_image_link_b">
                           </a>
                       </div>
                       <div class="detail">
                           <ul>
                               <li class="hd"><a href="some_link_b">SomeTitleText-B</a></li>
                           </ul>
                       </div>
                   </div>
               </li>
           </ul>
          </div>
        """
    souped_html_data = BeautifulSoup(z, "html.parser")

    div_detail_list = souped_html_data.find_all("div", "detail")
    div_pic_list = souped_html_data.find_all("div", "pic")

    for div_detail in div_detail_list:
        details = div_detail.get_text()


    for div_link in div_detail_list:
        div_link_a = div_link.find_all('a')
        for div_link_href in div_link_a:
            div_link_href_url = div_link_href.get('href')

    for div_pic in div_pic_list:
        div_pic_a = div_pic.find_all('img')
        for div_pic_a_src in div_pic_a:
            div_pic_a_src_link = div_pic_a_src.get('src')

        csv_writer.writerow([details, div_link_href_url, div_pic_a_src_link])

Теперь, что бы я ни делал, я не могу получить все данные в правильной форме.Я имею в виду, если я изменяю отступ последней строки - иногда переменная details повторяется, иногда повторяются первые два поля.Итак, я уверен, что вложенный цикл For создает проблему.Есть ли способ вывести все циклы на один уровень и затем записать данные?Я думаю, что это решит проблему.

Решено с помощью @ Joël.Закрепил все петли как:

    for div_detail, div_link, div_pic in zip(div_detail_list, div_detail_list, div_pic_list):
        details = div_detail.get_text()

        div_link_a = div_link.find_all('a')
        for div_link_href in div_link_a:
            div_link_href_url = div_link_href.get('href')

        div_pic_a = div_pic.find_all('img')
        for div_pic_a_src in div_pic_a:
            div_pic_a_src_link = div_pic_a_src.get('src')

        csv_writer.writerow([details, div_link_href_url, div_pic_a_src_link])

1 Ответ

0 голосов
/ 04 января 2019

Чтобы использовать элементы из нескольких циклов параллельно, вы можете использовать встроенную функцию zip:

>>> seq0 = [1, 2, 3]
>>> seq1 = ['a', 'b', 'c']
>>> for s0, s1 in zip(seq0, seq1):
...    print(f"{s0} - {s1}") 
1 - a
2 - b
3 - c

Однако что-то мне кажется странным: выиспользовать три петли на трех разных наборах предметов, но вы уверены, что три из них будут одинаковой длины?

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