Beautiful Soup:从 <strong> 中提取所有 <br/>

Beautiful Soup: Extracting all the <br/> from the <strong>

我有一个非常愚蠢和烦人的问题,我尝试将 html 转换为 markdown 但我的 html 格式很愚蠢:我一直有这样的东西:

<strong>Ihre Aufgaben:<br/></strong>

<strong> <br/>Über die XXXX GmbH:<br/></strong>

完全有效 HTML.

但是我的库转换为 Markdown (HTML2Text) 将其转换为:

**Ihre Aufgaben:\n**

** \nÜber die XXXX GmbH:\n**

这是一个 already reported issue 因为 markdown 无效并且无法正确呈现

我解决这个问题的方法如下:

我的代码(格式还不是很好):

soup = BeautifulSoup(html)
emphased = soup.find_all('strong')
for single in emphased:
    children = single.children
    before = 0
    foundText = None
    after = 0
    for child in children:
        if not isinstance(child, NavigableString):
             if foundText:
                after += 1
                child.unwrap()
             else:
                before += 1
                # DOES NOT WORK
                child.unwrap()
        else:
           foundText = single.get_text().strip()

我目前的问题是什么?

我想解开 <br/> before 内容并将它们放在 before <strong> 元素和我无法实现(并且没有在文档中找到如何进行)。

我想更普遍地实现什么?:

我想转换:

<strong> <br/>Über die XXXX GmbH: </strong>

进入

# Note the space
(whitespace)<br/><strong>Über die XXXX GmbH:</strong>(whitespace)

不一定非得用Beautiful Soup,我只是不知道其他解决方案。

提前致谢!

根据您的示例,您可以从 strong 标签中提取所有 br 标签并添加到它们前面,用新标签替换最新标签。

这是一个片段:

from bs4 import BeautifulSoup

soup = BeautifulSoup("<strong>Ihre Aufgaben:<br/></strong>", "html.parser")
for strong in soup.find_all("strong"):
    [s.extract() for s in strong.find_all('br')]
    strong.string = strong.get_text(strip=True)
    strong.replaceWith(BeautifulSoup( " %s%s " % ("<br/>", strong), "html.parser"))
print soup

输出:

<br/><strong>Ihre Aufgaben:</strong>