靓汤:从<strong>中提取所有<br/>

2024-06-10 15:28:52 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

或者

^{pr2}$

这是完全有效的HTML。在

但是,要转换为Markdown(HTML2Text)的“我的库”将其转换为:

**Ihre Aufgaben:\n**

以及

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

这是一个already reported issue,因为降价无效,无法正确呈现

我对这个问题的处理方法如下:

  • 使用BeautifulSoup查找导致此问题的所有strong
  • <br/>分成两组:一组在文本之前,另一组在文本之后。在
  • 展开文本后面的那些,以便将它们推出<strong>

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

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/>放在内容之前,并把它们放在元素<strong>之前,但我无法做到这一点(并且在文档中没有找到如何继续)。在

我更希望实现什么目标?

我想改变这一点:

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

进入

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

它不一定要用靓汤,我只是不知道其他的解决办法。在

提前谢谢!在


Tags: 文本brchildhtml格式stronggmbhchildren
1条回答
网友
1楼 · 发布于 2024-06-10 15:28:52

根据您的示例,您可以从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>

相关问题 更多 >