使用BeautifulSoup获取元素中的实际内容

时间:2017-06-18 13:44:10

标签: python beautifulsoup

我有一些看起来像这样的HTML:

<textarea>&lt;p&gt;</textarea>

如果我在Python中做这样的事情:

import bs4
doc = bs4.BeautifulSoup("<textarea>&lt;p&gt;</textarea>", "html.parser")
print(doc.select("textarea")[0].string)

打印结果<p>。这绝对是错误的,令人难以置信的误导性,这个元素的实际内容根本不包括<>个字符。

如何在元素中获取实际内容,因为我看看我是否手动curl页面?我可以关闭此功能吗?

我也试过这个:

>>> for c in doc.select("textarea")[0].children:
...   print(c)
... 
<p>

1 个答案:

答案 0 :(得分:1)

这是default documented behavior of the bs4 package

  

如果你给Beautiful Soup一个包含HTML实体的文件   “&amp; lquot;”,它们将被转换为Unicode字符。如果你那么   将文档转换为字符串,Unicode字符将是   编码为UTF-8。你不会得到HTML实体。默认情况下,   输出时唯一被转义的字符是裸露的&符号   和尖括号。这些变为&amp;&lt;&gt;,   这样美丽的汤不会无意中生成无效的HTML或   XML。

您可以按原样恢复实体:

In [1]: import bs4

In [2]: doc = bs4.BeautifulSoup("<textarea>&lt;p&gt;</textarea>", "html.parser")

In [3]: textarea = doc.select_one("textarea")

In [4]: textarea.unwrap()
Out[4]: <textarea></textarea>

In [5]: print(doc)
&lt;p&gt;