【问题标题】:Python : write csv with data from multiple nested for loopPython:用来自多个嵌套for循环的数据编写csv
【发布时间】:2019-05-30 19:41:55
【问题描述】:

我正在尝试抓取网站并将数据写入 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])

现在,无论我做什么,我都无法以正确的形式获取所有数据。我的意思是,如果我更改最后一行的缩进 --- 有时会重复详细信息变量,有时会重复前两个字段。 所以,我确信嵌套的 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])

【问题讨论】:

  • 请举一些例子,以便重现您的问题。 stackoverflow.com/help/how-to-ask
  • 请编辑代码以修复缩进 - 如果不正确,几乎不可能考虑评论
  • 使用四个空格更正了缩进。
  • 您使用z = """(...)"""(多行字符串定义)进行编辑,然后使用z.text 似乎很可能引发AttributeError: 'str' object has no attribute 'text'。你测试过吗?
  • 感谢指点。该 .text 用于 z = example.com。然后,我将其替换为 html 示例,因此必须删除 .text。

标签: python csv for-loop


【解决方案1】:

为了并行使用来自多个循环的项目,您可以使用内置的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

但是,我觉得有些奇怪:您在三个不同的项目集上使用了三个循环,但您确定它们三个的长度相同吗?

【讨论】:

  • 是的,我确定。最后所有的结果都相同。
猜你喜欢
  • 1970-01-01
  • 2018-07-09
  • 2019-08-29
  • 2016-11-15
  • 1970-01-01
  • 1970-01-01
  • 2015-10-15
  • 2021-06-27
  • 1970-01-01
相关资源
最近更新 更多