BeautifulSoup 内部html?
假设我有一个带有 div
的页面。我可以使用soup.find()轻松获取该div。
现在我有了结果,我想打印该 div
的整个 innerhtml
:我的意思是,我需要一个包含所有 html 标签和文本的字符串总而言之,就像我在 javascript 中使用 obj.innerHTML
得到的字符串一样。这可能吗?
Let's say I have a page with a div
. I can easily get that div with soup.find()
.
Now that I have the result, I'd like to print the WHOLE innerhtml
of that div
: I mean, I'd need a string with ALL the html tags and text all toegether, exactly like the string I'd get in javascript with obj.innerHTML
. Is this possible?
发布评论
评论(8)
TL;DR
在 BeautifulSoup 4 中,如果您想要 UTF-8 编码的字节字符串,请使用
element.encode_contents()
;如果您想要 Python Unicode 字符串,请使用element.decode_contents()
。例如,DOM 的 innerHTML 方法 可能如下所示:这些函数当前不在在线文档,因此我将引用当前函数定义和代码中的文档字符串。
encode_contents
- 自 4.0.4 起另请参阅 有关格式化程序的文档;您很可能会使用
formatter="minimal"
(默认值)或formatter="html"
(对于 html 实体),除非您想以某种方式手动处理文本。encode_contents
返回编码的字节串。如果您想要 Python Unicode 字符串,请使用decode_contents
代替。decode_contents
- 从 4.0.1 开始decode_contents
与encode_contents
执行相同的操作,但返回 Python Unicode 字符串而不是编码的字节字符串。BeautifulSoup 3
BeautifulSoup 3 没有上述功能,而是有
renderContents
这个功能被添加回 BeautifulSoup 4 (4.0.4 中)以实现兼容性与 BS3。
TL;DR
With BeautifulSoup 4 use
element.encode_contents()
if you want a UTF-8 encoded bytestring or useelement.decode_contents()
if you want a Python Unicode string. For example the DOM's innerHTML method might look something like this:These functions aren't currently in the online documentation so I'll quote the current function definitions and the doc string from the code.
encode_contents
- since 4.0.4See also the documentation on formatters; you'll most likely either use
formatter="minimal"
(the default) orformatter="html"
(for html entities) unless you want to manually process the text in some way.encode_contents
returns an encoded bytestring. If you want a Python Unicode string then usedecode_contents
instead.decode_contents
- since 4.0.1decode_contents
does the same thing asencode_contents
but returns a Python Unicode string instead of an encoded bytestring.BeautifulSoup 3
BeautifulSoup 3 doesn't have the above functions, instead it has
renderContents
This function was added back to BeautifulSoup 4 (in 4.0.4) for compatibility with BS3.
给定一个像
这样的 BS4 soup 元素,这里有一些不同的方法和可用于以不同方式检索其 HTML 和文本的属性以及它们将返回的内容的示例。
InnerHTML:
OuterHTML:
OuterHTML(美化):
仅文本(使用 .text):
仅文本(使用.string):
Given a BS4 soup element like
<div id="outer"><div id="inner">foobar</div></div>
, here are some various methods and attributes that can be used to retrieve its HTML and text in different ways along with an example of what they'll return.InnerHTML:
OuterHTML:
OuterHTML (prettified):
Text only (using .text):
Text only (using .string):
其中一个选项可以使用类似的东西:
One of the options could be use something like that:
str(element)
帮助您获取 outerHTML,然后从外部 html 字符串中删除外部标签。str(element)
helps you to get outerHTML, then remove outer tag from the outer html string.只使用
unicode(x)
怎么样?似乎对我有用。编辑:这将为您提供外部 HTML,而不是内部 HTML。
How about just
unicode(x)
? Seems to work for me.Edit: This will give you the outer HTML and not the inner.
最简单的方法是使用 Children 属性。
它将返回一个列表。因此,您可以使用简单的 for 循环获得完整的代码。
The easiest way is to use the children property.
it will return a list. So, you can get the full code using a simple for loop.
如果我没有误解的话,你的意思是对于这样的例子:
输出应该是这样的:
所以这是你的答案:
If I do not misunderstand, you mean that for an example like this:
the output should de look like this:
So here is your answer:
对于纯文本,Beautiful Soup 4
get_text()
如果您只需要文档或标签内的人类可读文本,则可以使用
get_text()
方法。它返回文档中或标签下的所有文本,作为单个 Unicode 字符串:您可以指定用于将文本位连接在一起的字符串:
您可以告诉 Beautiful Soup 从每个文本的开头和结尾去除空格一些文本:
但此时您可能想使用
.stripped_strings
生成器,并自己处理文本:从 Beautiful Soup 版本 4.9.0 开始,当
lxml
或者html.parser
正在使用,、