当我想要一列时,Python to CSV 将字符串分成两列

Posted

技术标签:

【中文标题】当我想要一列时,Python to CSV 将字符串分成两列【英文标题】:Python to CSV is splitting string into two columns when I want one 【发布时间】:2017-02-15 14:27:31 【问题描述】:

我正在用 BeautifulSoup 抓取一个页面,部分逻辑是,有时<td> 标记的部分内容中可能包含<br>

所以有时它看起来像这样:

<td class="xyz">
    text 1
    <br>
    text 2
</td>

有时它看起来像这样:

<td class="xyz">
    text 1
</td>

我正在循环并添加到一个 output_row 列表,我最终将它添加到一个列表列表中。无论我看到的是前一种格式还是后一种格式,我都希望文本位于一个单元格中。

我找到了一种方法来确定我是否看到了&lt;br&gt; 标签,因为 td.string 显示为 none,而且我还知道文本 2 中始终包含“ABC”。所以:

    elif td.string == None:
        if 'ABC' in td.contents[2]:
            new_string = td.contents[0] + ' ' + td.contents[2]
            output_row.append(new_string)
            print(new_string)
        else:    
            #this is for another situation and it works fine

当我在 Jupyter Notebook 中打印此内容时,它显示为“文本 1 文本 2”作为一行。但是当我打开我的 CSV 时,它位于两个不同的列中。因此,当 td.string 有内容(意味着没有 &lt;br&gt; 标签)时,文本 1 显示在一列中,但是当我到达具有 &lt;br&gt; 标签的部分时,我的所有数据都会被转移。

我不确定为什么在将它们附加到列表之前连接它们时它显示为两个不同的字符串(两列)。

我正在写这样的文件:

with open('C:/location/file.csv', 'w',newline='') as csv_file:
    writer=csv.writer(csv_file,delimiter=',')
    #writer.writerow(headers)
    for row in output_rows:
        writer.writerow(row)

csv_file.close

【问题讨论】:

你是怎么写文件的? 在对 OP 的编辑中添加。 对不起,如果我遗漏了什么,但你不能打电话给''.join(td.text.split()) 删除任何&lt;br&gt;s 并用这种方式修复它吗? 样本输入看起来一切正常。 td.contents[0] + ' ' + td.contents[2] 的结果字符串是否包含逗号?如果是这样,它将导致您正在经历的事情。此外,您的 csv_file.close 实际上并没有关闭文件,因为您实际上并没有调用它。此外,如果您 调用它,它会引发异常 - with 隐式关闭打开的文件。仅供参考。 谢谢大家。 split 和 get_text() 函数都有效。我意识到我在 Jupyter 中的(愚蠢的)错误是我没有在它上面运行一个单元格来重置我的 output_rows 并且我只是不断地得到同样的东西。不过感谢 get_text() 函数! 【参考方案1】:

您可以使用带有“strip”和“separator”的get_text() 处理这两种情况:

from bs4 import BeautifulSoup

dat="""
<table>
    <tr>
        <td class="xyz">
            text 1
            <br>
            text 2
        </td>

        <td class="xyz">
            text 1
        </td>
    </tr>
</table>
"""

soup = BeautifulSoup(dat, 'html.parser')
for td in soup.select("table > tr > td.xyz"):
    print(td.get_text(separator=" ", strip=True))

打印:

text 1 text 2
text 1

【讨论】:

我同意这是一种更好的获取数据方法,但如果我正确理解了这个问题,问题是在写入 csv 时字符串被分成两列.我怀疑 OP 正在写入文件的实际数据中有一个 , @That1Guy 好点,毕竟这可能不是问题的直接答案。我怀疑您的“数据包含逗号”理论是正确的。谢谢! @That1Guy 谢谢!奇怪的是,字符串中有逗号,但它们并没有被分开。我得到 2 列的原因是因为我没有重置我的列表并且我一直在进行更改并且打印输出会更改,但是现在导出到 csv。

以上是关于当我想要一列时,Python to CSV 将字符串分成两列的主要内容,如果未能解决你的问题,请参考以下文章

将列表写入python中的CSV列时出错[重复]

在 pandas/python 中,读取存储为字符串的数组

pandas to_csv:将 pandas 写入 csv 时抑制 csv 文件中的科学记数法

python删除列后行变多了

当我使用 pandas 读取 .csv 中的特定列时,奇怪的跳转

PySpark 在创建包含现有列名的新列时读取多个文件