当HTML表包含多个标记时,让pandas.read_html()工作

时间:2015-07-31 23:13:30

标签: python html pandas

我尝试解析在http://www.swiftcodesbic.com找到的表格,并且我使用Pandas自动抓取表格。在大多数情况下,这工作正常,但有一个表有两个<tbody>标签,我认为它导致打嗝。可以找到有缺陷的表here

我用来将html解析为pandas.DataFrame的代码是:

pandas.read_html(countryPage.text, attrs={"id":"t2"}, skiprows=1)[0]

其中countryPagerequests.get()个对象。有什么我可以添加到pandas调用告诉它抓住第二个<tbody>标签?或者,如果这不是问题,那么有人可以解释可能导致它返回未找到的表格的问题吗?&#34;错误?提前谢谢。

修改

这是我目前正在使用的解决方案,但我仍然想知道更多的pythonic&#39;接近这个。

try:
  tempDataFrame = pd.read_html(countryPage.text, attrs={"id":"t2"}, skiprows=1)[0]
except:
  if "france" is in url: #pseudo-code
    soup = BeautifulSoup(countryPage.text)
    table = soup.find_all("table")[2].findAll('tbody')[1] #this will vary based on your situation
    table = "<table>" + str(table) + "</table>" #pandas needs the table tag to recognize a table
    tempDataFrame = pd.read_html(table)[0]

同样,我有兴趣知道如何以更有效的方式做到这一点。

1 个答案:

答案 0 :(得分:1)

使用match参数应该可以解决问题。来自pandas.read_html文档:

match : str or compiled regular expression, optional

    The set of tables containing text matching this regex or string will be returned. Unless the HTML is extremely simple you will probably need to pass a non-empty string here. Defaults to ‘.+’ (match any non-empty string). The default value will return all tables contained on a page. This value is converted to a regular expression so that there is consistent behavior between Beautiful Soup and lxml.

尝试这种方式

tempDataFrame = pd.read_html(countryPage.text, match='foo', skiprows=1)

其中foo是表

中包含的字符串