【问题标题】:How to transfer a column of data into one row with multiple columns in python?如何在python中将一列数据传输到具有多列的一行中?
【发布时间】:2019-08-18 18:11:18
【问题描述】:

我正在尝试从网站上抓取一些数据,并设法收集了重要信息,但是当我将其打印到 Excel 文件中时,数据只会流入一列。提供的代码是否有解决方案,或者我需要创建多个结果然后打印出来。

我对网络抓取非常陌生,我尝试使用.join,它只是将所有数据放入我想要的一行中,但是它们全部连接到一列中


totals = page_soup.findAll("p", {"class":"b-fight-details__table-text"})

for i in totals:
    stats = i.text.replace("\n"," ")        
    print(stats, end= " ")
    f.write(stats)

f.close()

 Stephen Thompson   Anthony Pettis         0            1            47 of 107            32 of 55            43%            58%            47 of 107 

目前的输出是这样的,但是它都卡在一个列中 我希望它如下所示,显然我将在输出代码中包含标题

Fighter A        Fighter B      KD  TKD  S     TS  
Stephen Thompson Anthony Pettis 0   1    47 of 107 32 of 55 43% 58% etc...

【问题讨论】:

  • 能给个网址吗?
  • 你不想让战士分列吗?我看到他们使用段落来分隔而不是新行。您会在单独的运行中多次写入输出文件,还是只抓取一次并写入文件?

标签: excel python-3.x web-scraping beautifulsoup


【解决方案1】:

只需更改打印的结尾

for i in totals:
    stats = i.text.strip()        
    print(stats, end = " ")
    #...#

它应该可以工作。

如果你想在你编写的输出文件中使用相同的替换:

f.write(stats + " ")

与:

f.write(stats + " ")

例如:

with open("out.txt", "w") as f:
    for i in totals:
        stats = i.text.strip()        
        print(stats, end = " ");
        f.write(stats + " ")

如果是包含“\n”字符的字符串本身,您可以替换它们:

with open("out.txt", "w") as f:
    for i in totals:
        stats = i.replace("\n", " ")        
        print(stats, end = " ");
        f.write(stats + " ")

【讨论】:

  • 似乎可以解决问题,只是当我打开 csv 文件时它仍然在一列中
  • 您是否将 f.write(stats + "\n") 更改为 f.write(stats + " ") ?如果你按照我在答案中写的那样写,它应该把每个 i 元素空间分开写。
  • for i in totals: stats = i.text.strip() print(stats, end = " ") f.write(stats + " ") f.close() 目前的代码是,最终将结果放入一列。我能够使用文本到 excel 中的列来修复它
  • 可能是字符串本身包含 \n 个字符。试试这个: stats = i.replace("\n", " ") 它应该可以工作。 (或 stats = i.text.replace("\n", " ") 如果您需要将其转换为字符串)
  • 仍然进入一列,但似乎能够从文本干净地转移到 excel 中的列,我想我可以使用这个。
【解决方案2】:

您可以尝试用 print(stats, end = " ") 替换代码行:print(stats)

【讨论】:

    【解决方案3】:

    如果只这样做一次并且您对该布局感到满意(p 标记分隔的内容最终在同一个单元格中)...您可以使用 pandas

    import pandas as pd   
    tables = pd.read_html('http://www.ufcstats.com/fight-details/56ae02578b1163ee')
    df = tables[0]
    df.to_csv(r'C:\Users\User\Desktop\data.csv', sep=',', encoding='utf-8-sig',index = False )
    

    如果您想使用 pandas 追加进行多场战斗,请参阅此答案:

    https://stackoverflow.com/a/17135044/6241235

    【讨论】:

    • 我将更改我的代码,以便能够读取带有“/56ae02578b1163ee”的 csv 文件 pandas 是否能够合并多个战斗?
    猜你喜欢
    • 2022-11-17
    • 2021-11-05
    • 1970-01-01
    • 1970-01-01
    • 2023-03-26
    • 1970-01-01
    • 2018-02-26
    • 1970-01-01
    • 2018-08-14
    相关资源
    最近更新 更多