BeautifulSoup innerhtml? - PullRequest
       7

BeautifulSoup innerhtml?

37 голосов
/ 13 ноября 2011

Допустим, у меня есть страница с div.Я могу легко получить этот div с помощью soup.find().

Теперь, когда у меня есть результат, я хотел бы напечатать ВСЕ innerhtml этого div: я имею в виду, мне нужна строкасо всеми HTML-тегами и текстом вместе, точно так же, как строка, которую я получил бы в javascript с obj.innerHTML.Возможно ли это?

Ответы [ 5 ]

44 голосов
/ 04 сентября 2013

TL; DR

В BeautifulSoup 4 используйте element.encode_contents(), если вы хотите, чтобы строка кодировала UTF-8, или element.decode_contents(), если вы хотите использовать строку Python Unicode. Например, метод innerHTML DOM может выглядеть примерно так:

def innerHTML(element):
    """Returns the inner HTML of an element as a UTF-8 encoded bytestring"""
    return element.encode_contents()

Эти функции в настоящее время отсутствуют в онлайн-документации, поэтому я приведу текущие определения функций и строку документа из кода.

encode_contents - с 4.0.4

def encode_contents(
    self, indent_level=None, encoding=DEFAULT_OUTPUT_ENCODING,
    formatter="minimal"):
    """Renders the contents of this tag as a bytestring.

    :param indent_level: Each line of the rendering will be
       indented this many spaces.

    :param encoding: The bytestring will be in this encoding.

    :param formatter: The output formatter responsible for converting
       entities to Unicode characters.
    """

См. Также документацию по форматерам ; Скорее всего, вы будете использовать formatter="minimal" (по умолчанию) или formatter="html" (для html-сущностей ), если не хотите каким-либо образом обрабатывать текст вручную.

encode_contents возвращает закодированную строку теста. Если вы хотите использовать строку Python Unicode, используйте вместо нее decode_contents.


decode_contents - с 4.0.1

decode_contents делает то же самое, что и encode_contents, но возвращает строку Python Unicode вместо закодированной строки тестирования.

def decode_contents(self, indent_level=None,
                   eventual_encoding=DEFAULT_OUTPUT_ENCODING,
                   formatter="minimal"):
    """Renders the contents of this tag as a Unicode string.

    :param indent_level: Each line of the rendering will be
       indented this many spaces.

    :param eventual_encoding: The tag is destined to be
       encoded into this encoding. This method is _not_
       responsible for performing that encoding. This information
       is passed in so that it can be substituted in if the
       document contains a <META> tag that mentions the document's
       encoding.

    :param formatter: The output formatter responsible for converting
       entities to Unicode characters.
    """

BeautifulSoup 3

BeautifulSoup 3 не имеет вышеуказанных функций, вместо этого он имеет renderContents

def renderContents(self, encoding=DEFAULT_OUTPUT_ENCODING,
                   prettyPrint=False, indentLevel=0):
    """Renders the contents of this tag as a string in the given
    encoding. If encoding is None, returns a Unicode string.."""

Эта функция была добавлена ​​обратно в BeautifulSoup 4 ( в 4.0.4 ) для совместимости с BS3.

11 голосов
/ 13 ноября 2011

Одним из вариантов может быть что-то подобное:

 innerhtml = "".join([str(x) for x in div_element.contents]) 
1 голос
/ 18 ноября 2017

Если вам нужен только текст (без HTML-тегов), вы можете использовать .text:

soup.select("div").text
1 голос
/ 30 января 2016

Как насчет unicode(x)? Кажется, работает на меня.

Редактировать: Это даст вам внешний HTML, а не внутренний.

0 голосов
/ 20 июня 2018

Ну, вы можете использовать .get_text() только для ТЕКСТ

soup.select("div").get_text()
...