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 无效并且无法正确呈现
我解决这个问题的方法如下:
- 使用BeautifulSoup找出导致这个问题的所有
strong
- 将
<br/>
分为 2 组:在文本之前的那些和在文本之后的那些。
- 将文本后面的展开,以便将它们推出
<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/>
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>
我有一个非常愚蠢和烦人的问题,我尝试将 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 无效并且无法正确呈现
我解决这个问题的方法如下:
- 使用BeautifulSoup找出导致这个问题的所有
strong
- 将
<br/>
分为 2 组:在文本之前的那些和在文本之后的那些。 - 将文本后面的展开,以便将它们推出
<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/>
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>