使用Python 3和Beautiful Soup 4删除HTML标记并将删除的数据保存到CSV文件

时间:2017-01-19 23:22:50

标签: python web-scraping beautifulsoup

我正在尝试从网页上的表中抓取数据,然后使用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)

以下是print命令返回的示例:

&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;nbsp条目对应于将变量分成不同类别的行。

理想情况下,我想删除这些标记,然后将输出保存为CSV文件。我是python和数据抓取的新手,所以非常感谢任何和所有的帮助。

谢谢!

2 个答案:

答案 0 :(得分:2)

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)

出: enter image description here

答案 1 :(得分:0)

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

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

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