使用pandas和bs4解析复杂的多头html表

时间:2017-08-10 15:34:27

标签: python pandas html-parsing bs4

Complex Table link

我使用bs4pandaslxml库来解析上面的html表,但我没有成功。使用pandas我尝试跳过行并将标头设置为0,但结果是DataFrame高度非结构化,并且似乎还缺少某些数据。

使用其他2个库我尝试使用选择器,甚至是xpath部分中的tbody,但在这两种情况下我都会收到一个空列表。

这将是我想要检索的内容:

enter image description here

任何人都可以帮我解决一下我是如何抓取这些数据的吗? 谢谢!

1 个答案:

答案 0 :(得分:2)

from bs4 import BeautifulSoup
from urllib.request import urlopen
import pandas as pd

page = urlopen('https://transparency.entsoe.eu/generation/r2/actualGenerationPerProductionType/show?name=&defaultValue=true&viewType=TABLE&areaType=BZN&atch=false&datepicker-day-offset-select-dv-date-from_input=D&dateTime.dateTime=09.08.2017%2000:00%7CUTC%7CDAYTIMERANGE&dateTime.endDateTime=09.08.2017%2000:00%7CUTC%7CDAYTIMERANGE&area.values=CTY%7C10YES-REE------0!BZN%7C10YES-REE------0&productionType.values=B01&productionType.values=B02&productionType.values=B03&productionType.values=B04&productionType.values=B05&productionType.values=B06&productionType.values=B07&productionType.values=B08&productionType.values=B09&productionType.values=B10&productionType.values=B11&productionType.values=B12&productionType.values=B13&productionType.values=B14&productionType.values=B20&productionType.values=B15&productionType.values=B16&productionType.values=B17&productionType.values=B18&productionType.values=B19&dateTime.timezone=UTC&dateTime.timezone_input=UTC')
soup = BeautifulSoup(page.read())

table = soup.find('tbody')

res = []
row = []

for tr in table.find_all('tr'):
    for td in tr.find_all('td'):
        row.append(td.text)
    res.append(row)
    row = []

df = pd.DataFrame(data=res)

然后使用df.columns添加列名并删除空列。

编辑:建议修改此for循环。 (BillBell)

>>> for tr in table.find_all('tr'):
...     for td in tr.find_all('td'):
...         row.append(td.text.strip())
...     res.append(row)
...     row = []
  • for语句的原始格式编译失败。
  • append的原始形式在常量中留下了新行和空白。