【问题标题】:Remove HTML tags and save scraped data to CSV file using Python 3 and Beautiful Soup 4使用 Python 3 和 Beautiful Soup 4 删除 HTML 标记并将抓取的数据保存到 CSV 文件
【发布时间】:2017-01-19 23:22:49
【问题描述】:

我正在尝试从网页上的表格中抓取数据,然后使用 Python 3 和 Beautiful Soup 4 将其保存到 CSV 文件中。我已经能够提取数据,但无法删除数据周围的标签或找到将其保存到 CSV 文件的方法。我梳理了以前提出的问题并尝试应用这些方法,但我仍然无法解决这个问题。

这是我的脚本:

import csv
import pandas as pd
import requests
from bs4 import BeautifulSoup

url="enter url here"
r=requests.get(url)
soup=BeautifulSoup(r.content,"lxml")

table=soup.find("table", attrs={"class":"smsEvents"})

list_rows=[]
for row in table.find_all('tr'):
    list_cells=[]
    for cell in row.find_all('td'):
        list_cells.append(cell)
    list_rows.append(list_cells)
print(list_rows)

这是打印命令返回的示例:

&amp;nbsp                             </td>, <td class="rel119 carrier">
&amp;nbsp                             </td>], [<td class="rel46 carrier">
                                    0.00
                                </td>, <td class="rel47 carrier">
                                    0.00
                                </td>, <td class="rel48 carrier">
                                    0.00

该表包含大约 25 个变量(行),每月记录一次(列)。我相信&amp;amp;nbsp 条目对应于将变量分成不同类别的行。

理想情况下,我想删除这些标签,然后将输出保存到 CSV 文件。我对 python 和数据抓取非常陌生,因此非常感谢任何和所有帮助。

谢谢!

【问题讨论】:

  • 张贴网址或表格的html代码
  • 404 未找到.....
  • 在您的问题中发布表格的 html 代码,这会有所帮助。

标签: python web-scraping beautifulsoup


【解决方案1】:
import csv
import pandas as pd
import requests
from bs4 import BeautifulSoup

url="https://ai.fmcsa.dot.gov/SMS/Carrier/1000196/History.aspx"
r=requests.get(url)
soup=BeautifulSoup(r.content,"lxml")

table=soup.find("table", attrs={"class":"smsEvents"})
with open('a.csv', 'w', newline='') as f:
    writer = csv.writer(f)
    for tr in table('tr'):
        row = [t.get_text(strip=True) for t in tr(['td', 'th'])]
        writer.writerow(row)

出来:

【讨论】:

    【解决方案2】:

    我建议在这里使用lxml 而不是 BeautifulSoup(直接。试试这样的方法:

    from lxml import html
    res=requests.get(url)
    node = html.fromstring(res.content)
    cells = node.xpath('//table[@class="smsEvents"]/tr/td')
    

    请注意,您可以使用完整的 xpath,而不是遍历父表的每个子元素来获取单元格。

    【讨论】:

    • 感谢大卫的建议。我会考虑再做一次,但用 lxml 代替。
    猜你喜欢
    • 2020-04-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-19
    • 2023-03-31
    相关资源
    最近更新 更多