在python中将html表转换为csv

Posted

技术标签:

【中文标题】在python中将html表转换为csv【英文标题】:convert html table to csv in python 【发布时间】:2016-02-11 12:47:09 【问题描述】:

我正在尝试从动态页面中抓取表格。在以下代码(需要 selenium)之后,我设法获取了 <table> 元素的内容。

我想将此表转换为 csv,我尝试了 2 件事,但都失败了:

pandas.read_html 返回一个错误,说我没有安装 html5lib,但我安装了,事实上我可以毫无问题地导入它。 soup.find_all('tr') 在我运行 soup = BeautifulSoup(tablehtml) 后返回错误 'NoneType' object is not callable

这是我的代码:

import time
from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait 
from selenium.webdriver.common.keys import Keys
import pandas as pd

main_url = "http://data.stats.gov.cn/english/easyquery.htm?cn=E0101"
driver = webdriver.Firefox()
driver.get(main_url)
time.sleep(7)
driver.find_element_by_partial_link_text("Industry").click()
time.sleep(7)
driver.find_element_by_partial_link_text("Main Economic Indicat").click()
time.sleep(6)
driver.find_element_by_id("mySelect_sj").click()
time.sleep(2)
driver.find_element_by_class_name("dtText").send_keys("last72")
time.sleep(3)
driver.find_element_by_class_name("dtTextBtn").click()
time.sleep(2)
table=driver.find_element_by_id("table_main")
tablehtml= table.get_attribute('innerHTML')

【问题讨论】:

tablehtml 的输出是什么? 粘贴时间过长。开头是这样的: 指标 2015 年 10 月 2015 年 9 月 2015 年 8 月 Jul 2011... 运行代码即可获得完整版(可能需要 pip install selenium ) 我用seleniumbs4 测试了你的代码,没有遇到任何问题。不知何故,您的汤对象返回为 None。 你的意思是你可以在我的汤对象上使用 find_all() ? 是的。我所能推荐的就是在你调用任何东西之前检查'tablehtml'和'soup'。 【参考方案1】:

在这里使用csv 模块和selenium 选择器可能更方便:

import csv
from selenium import webdriver
driver = webdriver.Firefox()
driver.get("http://example.com/")
table = driver.find_element_by_css_selector("#tableid")
with open('eggs.csv', 'w', newline='') as csvfile:
    wr = csv.writer(csvfile)
    for row in table.find_elements_by_css_selector('tr'):
        wr.writerow([d.text for d in row.find_elements_by_css_selector('td')])

【讨论】:

【参考方案2】:

在无法访问您实际尝试抓取的表的情况下,我使用了以下示例:

<table>
<thead>
<tr>
    <td>Header1</td>
    <td>Header2</td>
    <td>Header3</td>
</tr>
</thead>  
<tr>
    <td>Row 11</td>
    <td>Row 12</td>
    <td>Row 13</td>
</tr>
<tr>
    <td>Row 21</td>
    <td>Row 22</td>
    <td>Row 23</td>
</tr>
<tr>
    <td>Row 31</td>
    <td>Row 32</td>
    <td>Row 33</td>
</tr>
</table>

并使用以下方法刮掉它:

from bs4 import BEautifulSoup as BS
content = #contents of that table
soup = BS(content, 'html5lib')
rows = [tr.findAll('td') for tr in soup.findAll('tr')]

这个rows对象是一个列表列表:

[
    [<td>Header1</td>, <td>Header2</td>, <td>Header3</td>],
    [<td>Row 11</td>, <td>Row 12</td>, <td>Row 13</td>],
    [<td>Row 21</td>, <td>Row 22</td>, <td>Row 23</td>],
    [<td>Row 31</td>, <td>Row 32</td>, <td>Row 33</td>]
]

...您可以将其写入文件:

for it in rows:
with open('result.csv', 'a') as f:
    f.write(", ".join(str(e).replace('<td>','').replace('</td>','') for e in it) + '\n')

看起来像这样:

Header1, Header2, Header3
Row 11, Row 12, Row 13
Row 21, Row 22, Row 23
Row 31, Row 32, Row 33

【讨论】:

谢谢,但就像我提到的那样,beautifusoupl 在我的情况下返回一个 nonetype 并且 find_all 不起作用。此外,只需运行代码即可访问该表。 我给你一个工作的例子; BeautifulSoup 确实有效,您所要做的就是注意它的方法。你有没有尝试运行我提供的示例代码?你调用了“find_all”,它出错了,因为我使用的方法是“findAll”。请不要要求人们安装 selenium 并运行您的脚本来获取您需要帮助的表。干杯 我读过 findAll 和 find_all 完全一样 (***.com/questions/12339323/…) 但显然,“从 bs4 导入 BeautifulSoup”是这种情况,而不是“从 BeautifulSoup 导入 BeautifulSoup”,即我用什么。所以你是对的,对不起。

以上是关于在python中将html表转换为csv的主要内容,如果未能解决你的问题,请参考以下文章

在 Python 中将文本表转换为 CSV

使用python在django中将数据库转换为csv

在 Python 中将 .dbf 批量转换为 .csv

如何在python中将json转换为csv?

如何在 Python 中将多个 .txt 文件转换为 .csv 文件

在 Python 中将 JSON 转换为 HTML 表