Я пишу приложение для преобразования данных строки html-таблицы, полученных с веб-сайта (путем вызова RESR API), в формат словаря.Проблема заключается в том, что формат строки таблицы HTML является вложенным форматом таблицы HTML.Через некоторое время, выполняя поиск в Интернете, я не могу найти решение для этого случая.Несмотря на то, что есть много решений для преобразования JSON в HTML.Мой ввод строки таблицы HTML:
<table>
<tr>
<td>
<table>
<tr>
<th>sku</th>
<td>
<table>
<tr>
<th>capacity</th>
<td>1</td>
</tr>
<tr>
<th>name</th>
<td>Developer</td>
</tr>
</table>
</td>
</tr>
<tr>
<th>tags</th>
<td></td>
</tr>
<tr>
<th>properties</th>
<td>
<table>
<tr>
<th>gatewayRegionalUrl</th>
<td>https:test</td>
</tr>
<tr>
<th>createdAtUtc</th>
<td>2019-03-18T08:11:21.0001331Z</td>
</tr>
<tr>
<th>virtualNetworkType</th>
<td>None</td>
</tr>
<tr>
<th>additionalLocations</th>
<td>None</td>
</tr>
<tr>
<th>customProperties</th>
<td>
<table>
<tr>
<th>Protocols.Server.Http2</th>
<td>False</td>
</tr>
</table>
</td>
</tr>
<tr>
<th>certificates</th>
<td>None</td>
</tr>
</table>
</td>
</tr>
<tr>
<th>etag</th>
<td>AAAAAAFy3Vo=</td>
</tr>
<tr>
<th>type</th>
<td>test/service</td>
</tr>
<tr>
<th>id</th>
<td>/test</td>
</tr>
</table>
</td>
</tr>
</table>
Я использую библиотеку python BeautifulSoup для обработки строки HTML с помощью метода find_all (), чтобы найти все теги таблицы и извлечь теги th и td для ключа и значения, но проблема заключается в том, чтокак я могу обработать тег sub table внутри другого тега таблицы.Я думал об использовании рекурсивной функции с библиотекой BeautifulSoup, чтобы решить эту проблему. Кто-нибудь подскажет мне, как это сделать?
import json
from bs4 import BeautifulSoup
str_html = "<table><tr><td><table><tr><th>sku</th><td><table><tr><th>capacity</th><td>1</td></tr><tr><th>name</th><td>Developer</td></tr></table></td></tr><tr><th>tags</th><td></td></tr><tr><th>properties</th><td><table><tr><th>gatewayRegionalUrl</th><td>https:test/td></tr><tr><th>createdAtUtc</th><td>2019-03-18T08:11:21.0001331Z</td></tr><tr><th>virtualNetworkType</th><td>None</td></tr><tr><th>additionalLocations</th><td>None</td></tr><tr><th>customProperties</th><td><table><tr><th>Protocols.Server.Http2</th><td>False</td></tr></table></td></tr><tr><th>certificates</th><td>None</td></tr></table></td></tr><tr><th>etag</th><td>AAAAAAFy3Vo=</td></tr><tr><th>type</th><td>test/service</td></tr><tr><th>id</th><td>test</td></tr></table></td></tr></table>"
print(type(str_html))
for table in soup.find_all('table'):
keys = [th.get_text(strip=True)for th in table.find_all('th')]
values = [td.get_text("strip=True) for td in table.find_all('td')]
d = dict(zip(keys, values))
print(d)
Мой результат результата ожидания:
{
"etag": "AAAAAAFy3Vo=",
"id": "test",
"properties": {
"additionalLocations": null,
"certificates": null,
"createdAtUtc": "2019-03-18T08:11:21.0001331Z",
"customProperties": {
"Protocols.Server.Http2": "False",
},
"gatewayRegionalUrl": "https:test",
"virtualNetworkType": "None"
},
"sku": {
"capacity": 1,
"name": "Developer"
},
"tags": {},
"type": "test/service"
}