Я пробовал с методом findChilden () и каким-то образом удалось вывести результат. Я не уверен, поможет ли это вам в любых других обстоятельствах.
from bs4 import BeautifulSoup
data='''<table>
<tr>
<td>1</td><td>2</td>
</tr>
<tr>
<td>3</td><td>4</td>
</tr>
<tr>
<td>5
<table><tr><td>11</td><td>22</td></tr></table>
6
</td>
</tr>
</table>'''
soup=BeautifulSoup(data,'html.parser')
for child in soup.find('table').findChildren("tr" , recursive=False):
tdlist = []
if child.find('table'):
for td in child.findChildren("td", recursive=False):
print(td.next_element.strip())
for td1 in td.findChildren("table", recursive=False):
for child1 in td1.findChildren("tr", recursive=False):
for child2 in child1.findChildren("td", recursive=False):
tdlist.append(child2.text)
print(' '.join(tdlist))
print(child2.next_element.next_element.strip())
else:
for td in child.findChildren("td" , recursive=False):
tdlist.append(td.text)
print(' '.join(tdlist))
Вывод:
1 2
3 4
5
11 22
6
РЕДАКТИРОВАНИЕ для объяснения
Шаг 1:
При использовании findChilden()
внутри таблицы сначала возвращается 3 записи.
for child in soup.find('table').findChildren("tr", recursive=False):
print(child)
Вывод:
<tr>
<td>1</td><td>2</td>
</tr>
<tr>
<td>3</td><td>4</td>
</tr>
<tr>
<td>5
<table><tr><td>11</td><td>22</td></tr></table>
6
</td>
</tr>
Шаг 2:
Убедитесь, что у любого ребенка есть тег <table>
и выполните некоторые действия.
if child.find('table'):
Шаг 3:
Выполните шаг 1 и используйте findChilden()
, чтобы получить <td>
тег.
Как только вы получите <td>
выполните шаги 1, чтобы снова получить дочерние элементы.
Шаг 4:
for td in child.findChildren("td", recursive=False)
print(td.next_element.strip())
Следующий элемент вернет первый текст тега, поэтому в этом случаеон вернет значение 5.
Шаг 5
for td in child.findChildren("td", recursive=False):
print(td.next_element.strip())
for td1 in td.findChildren("table", recursive=False):
for child1 in td1.findChildren("tr", recursive=False):
for child2 in child1.findChildren("td", recursive=False):
tdlist.append(child2.text)
print(' '.join(tdlist))
print(child2.next_element.next_element.strip())
Если вы видите здесь, я только что выполнил шаг 1 рекурсивно. Да И снова я использовалchild2.next_element.next_element
чтобы получить значение 6 после тега </table>
.