BeautifulSoup找到解开的文本

时间:2017-05-29 16:46:16

标签: python beautifulsoup

我有可能包含未打包文本的html文档,所有这些文本我需要包装在<p>中。 例如:

<p>lorem ipsum dolor</p>
other text
<b>Some text</b>

我需要这样的html变换:

<p>lorem ipsum dolor</p>
<p>other text</p>
<p><b>Some text</b></p>

但是我确实找到了找到未包装的dom节点的bs方法。 你有什么想法吗?

2 个答案:

答案 0 :(得分:1)

您可能会这样做:

from bs4 import BeautifulSoup, NavigableString
​
soup = BeautifulSoup("""<p>lorem ipsum dolor</p>
other text
<b>Some text</b>""")
​

首先使用soup.find获取所有有趣节点的父节点,然后使用所有有趣节点,如果它不是ap节点,则用标签p包装它,字符串节点被区别对待,因为它们包含新的行字符,需要将其删除:

for child in soup.find('body').children:
    if isinstance(child, NavigableString):
        p = soup.new_tag('p')
        p.append(child.strip())
        child.replace_with(p)
    elif child.name != 'p': 
        child.wrap(soup.new_tag('p'))

soup
<html>
    <body>
        <p>lorem ipsum dolor</p>
        <p>other text</p>
        <p><b>Some text</b></p>
    </body>
</html>

如果您不关心换行符号,可能就像:

for child in soup.find('body').children:
    if child.name != 'p': 
        child.wrap(soup.new_tag('p'))

答案 1 :(得分:0)

您可能希望将其视为字符串,在这种情况下,您可以使用regex并找到您要查找的文字。

一旦你知道该区域是什么样的,你可以在字符串中搜索它并添加你的

这是一个正则表达式的例子:

>>> s = """<p>lorem ipsum dolor</p>
    other text
    <b>Some text</b>"""
>>> m = re.findall(r'</\w>\s*[\w\s]+\s*<\w>',s)
>>> m
['</p>\nother text\n<b>']

\ w匹配任何字符(a-z,A-Z,0-9)

\ s匹配任何空格

&#39; *&#39;表示0次或更多次重复

[\ w]表示字母或空格字符

&#39; +&#39;表示重复1次或多次

有关正则表达式的更多详细信息以及如何使用它,请查看python documentation