【发布时间】:2023-02-11 02:07:08
【问题描述】:
这是我第一次在这里提问,所以我提前为任何错误道歉。欢迎提出改进此问题的建议。
我正在尝试使用 Beautiful Soup 抓取 a complex Wikipedia table(我不确定用术语“数据透视表”概括此类表是否合适),希望在 Pandas 中重新创建一个更简单、更易分析的版本。
JLPT "Applications and results" table on English Wikipedia
作为概览,从左侧开始:该表列出了 JLPT 举行的年份,当年开放的考试级别,然后是顶部列定义的统计数据。聚合列对我的目的来说并不重要,但如果有一种方法可以像这样抓取和重建它们,那就太好了。
使该表难以重建的原因是它对行进行了分组(“年”列下的年份),但那一年的行被放置在与年份标题相同的层次级别中,而不是在。此外,不是在每个 <tr> 行中都有一个 <th> 年份标签,它只出现在年份组的第一行中:
另一个问题是年份标题在它们的标签或属性中没有任何类型的定义标识符,所以我也不能只选择其中包含年份的行。
这些事情使得无法按年份对行进行分组。
到目前为止,我能够重建的唯一方法一些表格的作者是:
- 抓取整个表格,
- 将每个
<tr>元素附加到列表中, - 因为每年都有方括号中的引用:删除每个带有
[的字符串实例,导致每行中的元素长度统一 - 将它们转换为 pandas 数据框(手动添加列名、使用正则表达式删除剩余的 HTML 等),不带年份:
Processed dataframe (minus the years)
走到这一步之后,现在我意识到,如果不手动进行,仍然很难按年份对行进行分组。我想知道是否有一种更简单、更直接的方法来仅使用 BeautifulSoup 本身来抓取类似的复杂表,并且在 pandas 中几乎没有后处理。在这种情况下,如果无法以其原始数据透视表格式获取表格也没关系,我只想获得每一行的年份值。就像是:
先感谢您。
【问题讨论】:
标签: pandas web-scraping beautifulsoup html-table wikipedia