我有可能包含未打包文本的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方法。 你有什么想法吗?
答案 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