Я хотел бы получить содержимое тега <a>
с помощью BeautifulSoup (версии 4.12.3) на Python.
У меня есть этот код и пример HTML:
h = """
<a id="0">
<table>
<thead>
<tr>
<th scope="col">Человек</th>
<th scope="col">Наибольший интерес к</th>
<th scope="col">Возраст</th>
</tr>
</thead>
<tbody>
<tr>
<th scope="row">Крис</th>
<td>HTML-таблицы</td>
<td>22</td>
</tr>
</table>
</a>
"""
test = bs4.BeautifulSoup(h)
test.find('a') # find_all, select => те же результаты
Но это возвращает только :
<a id="0">
</a>
Я ожидал, что содержимое внутри <table>
появится между тегами <a>
.
(Я не знаю, является ли распространённой практикой оборачивать таблицу внутри тега <a>
, но HTML-код, который я пытаюсь прочитать, выглядит именно так)
Мне нужно разобрать содержимое таблицы из тега <a>
, так как мне нужно связать id="0"
с содержимым таблицы.
Как я могу это сделать?
Как мне получить содержимое тега <a>
вместе с тегом <table>
?
Явно укажите парсер, который вы хотите использовать (используйте html.parser
). По умолчанию будет использоваться “лучший” доступный парсер – предполагаю, lxml
, который не обрабатывает этот документ хорошо:
import bs4
h = """
<a id="0">
<table>
<thead>
<tr>
<th scope="col">Человек</th>
<th scope="col">Наибольший интерес к</th>
<th scope="col">Возраст</th>
</tr>
</thead>
<tbody>
<tr>
<th scope="row">Крис</th>
<td>HTML-таблицы</td>
<td>22</td>
</tr>
</table>
</a>
"""
test = bs4.BeautifulSoup(h, "html.parser") # <-- задайте парсер здесь
out = test.find("a")
print(out)
Выводит:
<a id="0">
<table>
<thead>
<tr>
<th scope="col">Человек</th>
<th scope="col">Наибольший интерес к</th>
<th scope="col">Возраст</th>
</tr>
</thead>
<tbody>
<tr>
<th scope="row">Крис</th>
<td>HTML-таблицы</td>
<td>22</td>
</tr>
</tbody></table>
</a>
Ответ
Чтобы получить содержимое тега <a>
с помощью библиотеки BeautifulSoup (версии 4.12.3) в Python, необходимо следовать простым шагам. В вашем коде есть некоторые моменты, которые следует учесть для корректного разбора HTML-кода.
Вот как можно получить контент внутри тега <a>
, в том числе и содержимое тега <table>
, используя правильный парсер. Ниже приведен полный пример:
import bs4
h = """
<a id="0">
<table>
<thead>
<tr>
<th scope="col">Person</th>
<th scope="col">Most interest in</th>
<th scope="col">Age</th>
</tr>
</thead>
<tbody>
<tr>
<th scope="row">Chris</th>
<td>HTML tables</td>
<td>22</td>
</tr>
</tbody>
</table>
</a>
"""
# Используем 'html.parser' для корректного разбора
test = bs4.BeautifulSoup(h, "html.parser")
out = test.find("a")
# Выводим содержимое тега <a>
print(out)
Ожидаемый результат
При выполнении данного кода вы получите вывод, который показывает содержимое тега <a>
, включая вложенную таблицу:
<a id="0">
<table>
<thead>
<tr>
<th scope="col">Person</th>
<th scope="col">Most interest in</th>
<th scope="col">Age</th>
</tr>
</thead>
<tbody>
<tr>
<th scope="row">Chris</th>
<td>HTML tables</td>
<td>22</td>
</tr>
</tbody>
</table>
</a>
Объяснение решения
-
Использование правильного парсера: Важно указать парсер
html.parser
, чтобы избежать проблем с неправильным разбором HTML-кода. Некоторые парсеры могут не обрабатывать такие случаи как с тегами<a>
, содержащими другие теги, корректно. -
Поиск тега
<a>
: С помощью методаfind()
вы можете найти первый экземпляр тега<a>
в вашем документе. - Вывод содержимого: При выводе найденного тега вы видите полное содержимое, включая вложенные теги
<table>
, что именно и требуется.
Следуя этому примеру, вы сможете извлечь содержимое тега <a>
и работать с ним по своему усмотрению.