美丽的汤解析错误

时间:2016-07-08 17:17:08

标签: python beautifulsoup

我正在尝试使用beautifulsoup首先删除html字符串中的<a>标记,但保留其内容。之后我想删除所有标签并用新线替换它们。

strip_tags函数来自This post

这是我想要做的一个例子:

text = "<p>This is a <a>test</a></p>"
soup = strip_tags(text, ["a"])
plain_text = soup.get_text("\n")
print(plain_text)

由于某种原因,输出为u'This is a \ntest'。如果<a>标记已被删除,为什么它仍然存在呢?

预期输出为This is a test

一个更复杂的例子: <p>First</p><a>Link</a><p>Second</p>

如何区分<p>代码,仍然可以删除<a>代码?

确实,如果您打印soup.encode_contents(),则不存在<a>

2 个答案:

答案 0 :(得分:-1)

  

strip_tags函数来自This post

该函数以递归方式替换包含文本的标记。

因此,您的'<a>test</a>'将替换为'test'。那里没有'<a>'个标签。

答案 1 :(得分:-1)

它的行为方式是因为strip_tags函数正在操作NavigableStrings。 (这就是你在strip_tags中看到所有unicode强制转换的原因)

当你运行soup.get_text(“\ n”)时,它会看到NavigableString的所有元素,并在分割时添加“\ n”,即使没有<a>标记存在。

为什么不使用get_text()来删除带有标签的文本?

text = "<p>This is a <a>test</a> man</p> <p> more stinking <a>p</a> tags </p>"
plain_text = BeautifulSoup(text, 'html.parser')
ptags = plain_text.find_all('p')
mytext = ""
for tag in ptags:
    mytext = mytext + tag.get_text() + "\n"
print(mytext)