为什么 CSV 在标题后出现空白行?

托德·布鲁斯

我正在使用 BeautifulSoup 从网站上抓取表格,但我很困惑为什么这会在我的标题后打印一个空白行以及如何修复它。

我的代码是:

page = requests.get('http://racing-reference.info/loopdata/2018-18/W')
page.encoding = 'utf-8'
soup = BeautifulSoup(page.text, 'html.parser')

table = soup.find_all(class_ = 'tb')
headers = [th.text for th in table[2].select("tr th")]

with open("out.csv", "w", newline='') as f:
    wr = csv.writer(f)
    wr.writerow(headers)
    wr.writerows([[td.text 
                   for td in row.find_all("td")] 
                   for row in table[2].select("tr + tr")])

正在读取的 HTML 如下所示:

<BR><BR><TABLE class=tb WIDTH=100% CELLPADDING=3 CELLSPACING=0>
<TR><TD ALIGN=CENTER COLSPAN=19 class=col>
<TR><TD COLSPAN=19 HEIGHT=20 ALIGN=CENTER class=newhead>Loop data for this race:</TD></TR>
<TR><TH class=col><A HREF=/loopdata?s=1&series=W&id=2018-18>Driver</A></TH>
<TH class=col><A HREF=/loopdata?s=2&series=W&id=2018-18>Start</A></TH>
<TH class=col><A HREF=/loopdata?s=3&series=W&id=2018-18>Mid Race</A></TH>
<TH class=col><A HREF=/loopdata?s=4&series=W&id=2018-18>Finish</A></TH>
<TH class=col><A HREF=/loopdata?s=5&series=W&id=2018-18>High Pos.</A></TH>
<TH class=col><A HREF=/loopdata?s=6&series=W&id=2018-18>Low Pos.</A></TH>
<TH class=col><A HREF=/loopdata?s=7&series=W&id=2018-18>Avg. Pos.</A></TH>
<TH class=col><A HREF=/loopdata?s=8&series=W&id=2018-18>Pass Diff.</A></TH>
<TH class=col><A HREF=/loopdata?s=9&series=W&id=2018-18>Green Flag Passes</A></TH>
<TH class=col><A HREF=/loopdata?s=10&series=W&id=2018-18>Green Flag Times Passed</A></TH>
<TH class=col><A HREF=/loopdata?s=11&series=W&id=2018-18>Quality Passes</A></TH>
<TH class=col><A HREF=/loopdata?s=12&series=W&id=2018-18>Pct. Quality Passes</A></TH>
<TH class=col><A HREF=/loopdata?s=13&series=W&id=2018-18>Fastest Lap</A></TH>
<TH class=col><A HREF=/loopdata?s=14&series=W&id=2018-18>Top 15 Laps</A></TH>
<TH class=col><A HREF=/loopdata?s=15&series=W&id=2018-18>Pct. Top 15 Laps</A></TH>
<TH class=col><A HREF=/loopdata?s=16&series=W&id=2018-18>Laps Led</A></TH>
<TH class=col><A HREF=/loopdata?s=17&series=W&id=2018-18>Pct. Laps Led</A></TH>
<TH class=col><A HREF=/loopdata?s=18&series=W&id=2018-18>Total Laps</A></TH>
<TH class=col><A HREF=/loopdata?s=19&series=W&id=2018-18>DRIVER RATING</A></TH>
</TR>
<TR CLASS=odd><TD class=col NOWRAP><A HREF=/driverlog/joneser02/W/2018 title="View this driver's loop data for all races">Erik Jones</A></TD><TD class=col ALIGN=RIGHT>29</TD><TD class=col ALIGN=RIGHT>26</TD><TD class=col ALIGN=RIGHT>1</TD><TD class=col ALIGN=RIGHT>1</TD><TD class=col ALIGN=RIGHT>31</TD><TD class=col ALIGN=RIGHT>18</TD><TD class=col ALIGN=RIGHT>31</TD><TD class=col ALIGN=RIGHT>153</TD><TD class=col ALIGN=RIGHT>122</TD><TD class=col ALIGN=RIGHT>46</TD><TD class=col ALIGN=RIGHT>30.1</TD><TD class=col ALIGN=RIGHT>9</TD><TD class=col ALIGN=RIGHT>49</TD><TD class=col ALIGN=RIGHT>29.2</TD><TD class=col ALIGN=RIGHT>1</TD><TD class=col ALIGN=RIGHT>0.6</TD><TD class=col ALIGN=RIGHT>168</TD><TD class=col ALIGN=RIGHT>84.6</TD></TR>

标题和数据打印得很好,但标题和数据之间有一个我似乎无法摆脱的空白行。我试过在行上使用 any() 函数,但这没有用。

谢谢。

贝利·帕克

在我看来,这来自:

[[td.text for td in row.find_all("td")] for row in table[2].select("tr + tr") if row]

如果我们查看您的 HTML,它具有一般形式:

<table>
  <tr><td></td></tr>
  <tr><td></td></tr>
  <!-- note this tr has no tds -->
  <tr><th></th><!-- ... --></tr>
  <tr><td></td><!-- ... --></tr>

请注意,您从中获取标题的行<tr>前面是 a <tr>(这匹配tr + tr)。但是,因为它没有任何<td>里面S,这个列表理解为空:[td.text for td in row.find_all("td")]

我建议使用以下方法,而不是这种方法:

  1. 收集<tr>表中的所有s:rows = table.select('tr')
  2. 从该列表的顶部删除行,直到找到标题(一个有多个<th>s)
  3. 然后,现在标题已被剥离,您可以在剩余的行上使用列表理解来提取数据: [[td.text for td in row] for row in rows]

或者,如果您不需要对数据进行任何处理(并且只想将其直接转换为 CSV),您可以只进行一个列表推导并提取<th>s 或<td>s。

[[x.text for x in row.find_all('td, th')] for row in table.select('tr')]

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

为什么在CSV顶部的空白行?

来自分类Dev

从csv文件中删除标题和空白行

来自分类Dev

从csv文件中删除标题和空白行

来自分类Dev

删除空白行后如何获取更新的csv文件?

来自分类Dev

Python CSV,空白行

来自分类Dev

有什么办法可以数数。csv文件中的空白行?

来自分类Dev

为什么从 CSV 读取失败并出现 NumberFormatException?

来自分类Dev

为什么csv文件中的某些行格式无效?

来自分类Dev

从CSV文件中删除空白行

来自分类Dev

RunSpacePool输出CSV包含空白行

来自分类Dev

为什么标题不出现

来自分类Dev

为什么空白行间歇出现在Stackdriver日志中?

来自分类Dev

为什么此代码为什么在写入的两行之间插入空白行(C#Excel Interop)?

来自分类Dev

从php的CSV文件中删除空白行

来自分类Dev

Python .csv编写器留下空白行

来自分类Dev

使用Python删除CSV中的空白行

来自分类Dev

R:write.csv-Excel显示空白行中断

来自分类Dev

删除MS EXCEL CSV文件末尾的空白行

来自分类Dev

使用GEANY移除CSV文件中的空白行

来自分类Dev

如何使用PowerShell在CSV文件之间插入空白行?

来自分类Dev

为什么在尝试使用Google Drive SDK插入CSV文件时出现错误400?

来自分类Dev

将图像转换为 CSV 文件时,为什么会出现 IndexError: List index out of range?

来自分类Dev

读取此CSV文件后,为什么我的powershell自定义属性为空?

来自分类Dev

为什么我的列表在保存到 csv 并重新打开后变成字符串?Python

来自分类Dev

为什么以前的sbt(版本≤0.13.6)在.sbt文件中的设置之间需要空白行?

来自分类Dev

为什么xargs -0添加一个额外的空白行?

来自分类Dev

为什么pandas.read_fwf没有按照指示跳过空白行?

来自分类Dev

(C ++)为什么不计算文本文件中的其他空白行?

来自分类Dev

为什么xargs -0添加一个额外的空白行?

Related 相关文章

  1. 1

    为什么在CSV顶部的空白行?

  2. 2

    从csv文件中删除标题和空白行

  3. 3

    从csv文件中删除标题和空白行

  4. 4

    删除空白行后如何获取更新的csv文件?

  5. 5

    Python CSV,空白行

  6. 6

    有什么办法可以数数。csv文件中的空白行?

  7. 7

    为什么从 CSV 读取失败并出现 NumberFormatException?

  8. 8

    为什么csv文件中的某些行格式无效?

  9. 9

    从CSV文件中删除空白行

  10. 10

    RunSpacePool输出CSV包含空白行

  11. 11

    为什么标题不出现

  12. 12

    为什么空白行间歇出现在Stackdriver日志中?

  13. 13

    为什么此代码为什么在写入的两行之间插入空白行(C#Excel Interop)?

  14. 14

    从php的CSV文件中删除空白行

  15. 15

    Python .csv编写器留下空白行

  16. 16

    使用Python删除CSV中的空白行

  17. 17

    R:write.csv-Excel显示空白行中断

  18. 18

    删除MS EXCEL CSV文件末尾的空白行

  19. 19

    使用GEANY移除CSV文件中的空白行

  20. 20

    如何使用PowerShell在CSV文件之间插入空白行?

  21. 21

    为什么在尝试使用Google Drive SDK插入CSV文件时出现错误400?

  22. 22

    将图像转换为 CSV 文件时,为什么会出现 IndexError: List index out of range?

  23. 23

    读取此CSV文件后,为什么我的powershell自定义属性为空?

  24. 24

    为什么我的列表在保存到 csv 并重新打开后变成字符串?Python

  25. 25

    为什么以前的sbt(版本≤0.13.6)在.sbt文件中的设置之间需要空白行?

  26. 26

    为什么xargs -0添加一个额外的空白行?

  27. 27

    为什么pandas.read_fwf没有按照指示跳过空白行?

  28. 28

    (C ++)为什么不计算文本文件中的其他空白行?

  29. 29

    为什么xargs -0添加一个额外的空白行?

热门标签

归档