Подтвердить что ты не робот

Разница между .string и .text BeautifulSoup

Я заметил что-то странное в работе с BeautifulSoup и не нашел никакой документации для поддержки этого, поэтому я хотел попросить здесь.

Скажем, у нас есть такие теги, которые мы проанализировали с помощью BS:

<td>Some Table Data</td>
<td></td>

официальный документированный способ извлечения данных - soup.string. Однако это извлекло NoneType для второго тега <td>. Поэтому я попробовал soup.text (потому что почему бы и нет?), И он извлек пустую строку точно так, как я хотел.

Однако я не мог найти ссылки на это в документации и беспокоюсь, что что-то пропущено. Может ли кто-нибудь сообщить мне, допустимо ли это использовать или это вызовет проблемы позже?

BTW Я очищаю данные таблицы с веб-страницы и имею в виду создание CSV-данных из данных, поэтому мне действительно нужны пустые строки, а не NoneTypes.

4b9b3361

Ответ 1

.string для объекта типа Tag возвращает объект типа NavigableString. С другой стороны, .text получает все дочерние строки и возвращает конкатенацию с использованием заданного разделителя. Возвращаемый тип .text - это объект unicode.

Из документации A NavigableString похож на строку Python unicode, за исключением того, что он также поддерживает некоторые функции, описанные в Навигация по дереву и Поиск по дереву.

Из документации в .string мы можем видеть, что если html похож на это,

<td>Some Table Data</td>
<td></td>

Затем .string на втором td вернет None. Но .text возвращает и пустую строку, которая является объектом типа unicode.

Для большего удобства

string
  • Свойство удобства Tag для получения одной строки внутри этого тега.
  • Если Tag имеет единственный дочерний элемент строки, возвращаемое значение - это строка.
  • Если у Tag нет детей или более одного ребенка, возвращаемое значение None
  • Если этот Tag имеет одно дочернее тег, возвращаемое значение является атрибутом "string" дочернего тега, рекурсивно.

И text

  • Получите все дочерние строки и верните конкатенированные с помощью заданного разделителя.

Если html выглядит следующим образом:

<td>some text</td>
<td></td>
<td><p>more text</p></td>
<td>even <p>more text</p></td>

.string на четырех td вернется,

some text
None
more text
None

.text даст результат, подобный этому,

some text

more text
even more text

Ответ 3

Если тег содержит несколько объектов, то неясно, к чему должна обращаться строка .string определяется как None:

Пример:

<td>sometext<p>sometext</p></td>

Приведенный выше код вернет NoneType, если: td.string выполняется, потому что td содержит тексты, а также другой p-тэг. Но td.text даст: sometextsometext