【发布时间】:2019-08-19 14:39:18
【问题描述】:
这个网站
https://itportal.ogauthority.co.uk/information/well_data/lithostratigraphy_hierarchy/rptLithoStrat_1Page2.html
似乎有一个组织得不好的 html 表。表格单元格的唯一标识符是每个 tr 标签内的宽度。我想抓取所有 60 页的信息。我怎样才能找到一种方法来适当地刮掉每一行表格?我知道标题的大小是 10 列,但是因为对于某些 tr 标签,我有 5 个 td 标签,而对于其他一些标签,我或多或少有 td 标签,根据它的准确刮取数据并不容易列。
在这里,您可以看到部分代码仅提取与一行相关的数据,但不保留空单元格的空值。
soup = BeautifulSoup(page.content, 'lxml') # Parse the HTML as a string
table = soup.find_all('table')[0] # Grab the first table
new_table = pd.DataFrame(columns=range(0,10), index = [0]) # I know the size
row_marker = 0
for row in table.find_all('tr'):
column_marker = 0
columns = row.find_all('td')
for column in columns:
new_table.iat[row_marker,column_marker] = column.get_text()
column_marker += 1
这是我从这段代码中得到的输出(将所有值放在一行中,它们之间没有任何间隙):
0 1 2 3 4 5 6 7 8 9
0 62.00 PACL Palaeocene Claystones SWAP NaN NaN NaN NaN NaN
但真正的输出应该是这样的:
0 1 2 3 4 5 6 7 8 9
0 62.00 NaN NaN PACL Palaeocene Claystones NaN NaN NaN NaN SWAP
【问题讨论】:
-
网站是什么?
-
itportal.ogauthority.co.uk/information/well_data/… 。我也在主要问题中添加了该网站。
-
一种可能的解决方案是创建一个包含特定列的所有可能值的列表,然后检查这些值中的任何一个是否在给定行的任何列中。这样,如果某列没有匹配项,您可以确定哪些值是空值。
-
另一个可行的解决方案是使用每个 td 的宽度来查找空值,因为每个 td 的宽度对于每个包含数据的单元格都是恒定的。
-
我明白了。使用基于分类的方法怎么样?我不知道抓取内容的具体细节是什么,但是如果您对每列中的数据类型有所了解,您可以使用字典列表来获取每列的所有可能结果,并比较从列表中每个字典的每一行都将每个单元格分类在相应的列下。之后,您可以用“NaN”填充其余的行数据单元格。
标签: python html web-scraping html-table beautifulsoup