Получение содержимого тега с помощью BeautifulSoup

Вопросы и ответы

Я хотел бы получить содержимое тега <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>

Объяснение решения

  1. Использование правильного парсера: Важно указать парсер html.parser, чтобы избежать проблем с неправильным разбором HTML-кода. Некоторые парсеры могут не обрабатывать такие случаи как с тегами <a>, содержащими другие теги, корректно.

  2. Поиск тега <a>: С помощью метода find() вы можете найти первый экземпляр тега <a> в вашем документе.

  3. Вывод содержимого: При выводе найденного тега вы видите полное содержимое, включая вложенные теги <table>, что именно и требуется.

Следуя этому примеру, вы сможете извлечь содержимое тега <a> и работать с ним по своему усмотрению.

Оцените материал
Добавить комментарий

Капча загружается...