【问题标题】:Scrape table from email and write to CSV (Removing \r\n) - Python从电子邮件中抓取表格并写入 CSV(删除 \r\n) - Python
【发布时间】:2020-12-09 10:41:50
【问题描述】:

我正在尝试从电子邮件中抓取表格并删除所有特殊字符(\r\n 等),然后再写入 csv 文件。

我已经设法抓取了数据,但是 列包含在我无法删除的 '\r\n' 中(我是新手)

表试图抓取:

Table - Image

Python 代码:

for emailid in items:
# getting the mail content
resp, data = m.fetch(emailid, '(UID BODY[TEXT])')
text = str(data[0][1])

tree = BeautifulSoup(text, "lxml")
table_tag = tree.select("table")[0]
tab_data = [[item.text for item in row_data.select("td")]
            for row_data in table_tag.select("tr")]
print(table_tag)
for data in tab_data:
    writer.writerow(data)
    print(' '.join(data))

结果:

\r\n快速编号。\r\n \r\n订单号=\r\n\r\n \r\n部件号\r\n \r\n描述\r\n \r\ nUOM=\r\n\r\n \r\n订购数量\r\n \r\n接收数量\r\n \r\n接收日期\r\n(dd/mm/yyyy)\r\n \r \n其他信息\r\n \r\nE03B1A\r\n \r\nE0015130\r\n \r\nYK71114105=\r\np>\r\n \r\n彩顶组件 (R)=\r\n\r\n \r \nPIECE\r\n \r\n1\r\n \r\n1\r\n \r\n06/10/2020=\r\np>\r\n \r\n \r\nE03B1E\r\n \r\nE0015134\r\n \r\nYK78804497=\r\np>\r\n \r\nDIE BUTTON=\r\np>\r\n \r\nPIECE\ r\n \r\n4\r\n \r\n4\r\n \r\n06/10/2020=\r\np>\r\n \r\n

预期结果

  • 快速编号 订货号 零件编号
  • nE03B1A nE0015130 nYK71114105
  • nE03B1E nE0015134 nYK78804497

提前致谢(这是我的第一篇文章,所以请温柔)

【问题讨论】:

    标签: python beautifulsoup


    【解决方案1】:

    要删除这些,您需要在这些字符串上使用.strip()。所以试试:

    tab_data = [[item.text.strip() for item in row_data.select("td")]
                for row_data in table_tag.select("tr")]
    

    但我可以建议,让 pandas 从 html 中解析表格:

    import pandas as pd
    
    for emailid in items:
    # getting the mail content
        resp, data = m.fetch(emailid, '(UID BODY[TEXT])')
        text = str(data[0][1])
        
        table = pd.read_html(text)[0]
        df_obj = table.select_dtypes(['object'])
        table[df_obj.columns] = df_obj.apply(lambda x: x.str.strip())
        print(table)
        table.to_csv('file.csv', index=False)
    

    【讨论】:

    • 这样更干净(谢谢)我唯一的问题是我仍然得到 '\r\n' \r\n描述\r\n \r\nCOLOUR TOP ASSY (R) =\r\n\r\n \r\n模具按钮=\r\np>\r\n \r\n墨盒底座\r\n \r\nO-RING,密封,板到机器人,清除\r\ n
    • @Chambo,立即尝试
    • 遗憾的是没有,数据还在返回\r\n :( \r\nQuick No.\r\n \r\nOrder No=\r\n\r\n \r\ n部件号\r\n \r\nE03B1A\r\n \r\nE0015130\r\n \r\nYK71114105=\r\np>\r\n
    • 已发送 :) 非常感谢您的帮助
    • 设法破解它....我只需要更新... table[df_obj.columns] = df_obj.apply(lambda x: x.str.strip("\\r\\ n"))
    【解决方案2】:

    重新导入

    removedData = re.sub("^[a-zA-Z0-9]", "", dataForRemoveSlashNandR)

    打印(删除数据)

    【讨论】:

    • 在我的示例中,这从表中删除了一些字符:(
    • 好的,那么您需要使用以下 dataWithSlashNandR.replace("\r\n", "")
    【解决方案3】:

    感谢:chitown88

    for emailid in items:
    # getting the mail content
    resp, data = m.fetch(emailid, '(UID BODY[TEXT])')
    text = str(data[0][1])
    
    table = pd.read_html(text)[0]
    df_obj = table.select_dtypes(['object'])
    table[df_obj.columns] = df_obj.apply(lambda x: x.str.strip("\\r\\n"))
    print(table)
    table.to_csv(outfile, index=False)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多