【发布时间】: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 列表,我最终将它添加到一个列表列表中。无论我看到的是前一种格式还是后一种格式,我都希望文本位于一个单元格中。
我找到了一种方法来确定我是否看到了<br> 标签,因为 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 有内容(意味着没有 <br> 标签)时,文本 1 显示在一列中,但是当我到达具有 <br> 标签的部分时,我的所有数据都会被转移。
我不确定为什么在将它们附加到列表之前连接它们时它显示为两个不同的字符串(两列)。
我正在写这样的文件:
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())删除任何<br>s 并用这种方式修复它吗? -
样本输入看起来一切正常。
td.contents[0] + ' ' + td.contents[2]的结果字符串是否包含逗号?如果是这样,它将导致您正在经历的事情。此外,您的csv_file.close实际上并没有关闭文件,因为您实际上并没有调用它。此外,如果您 调用它,它会引发异常 -with隐式关闭打开的文件。仅供参考。 -
谢谢大家。 split 和 get_text() 函数都有效。我意识到我在 Jupyter 中的(愚蠢的)错误是我没有在它上面运行一个单元格来重置我的 output_rows 并且我只是不断地得到同样的东西。不过感谢 get_text() 函数!
标签: python csv beautifulsoup