我找到了html文档中的所有文本,我想添加span标记,其中包含有关每个文本的一些信息,如下所示
def recursiveChildren(x):
if "childGenerator" in dir(x):
for child in x.childGenerator():
recursiveChildren(child)
else:
if not x.isspace():
content = x.string
new_tag = soup.new_tag("span")
content.insert_before(new_tag)
if __name__ == "__main__":
with open("path to html",'r') as file:
soup = BeautifulSoup(file)
for child in soup.body.childGenerator():
recursiveChildren(child)
我收到错误,因为字符串对象之前没有插入属性。如何在字符串前插入标记。我也尝试获取字符串的父标记,并在父标记内容之前添加添加span标记但是如果存在嵌套标记则会产生问题,因为我想在每个独立字符串之前使用span标记。可能吗?如下所示,但在Python Insert span tag before # content text
中Adding Span before specific string with jQuery
示例Html:
<p class=MsoNormal >This is first string <b> Second String </b> , </span><span style='font-family:"Times New Roman"><o:p></o:p></span></p>
我希望输出像
<p class=MsoNormal >**<span>**This is first string</span> <b>**<span>** Second String </span></b>**<span>** , </span><span style='font-family:"Times New Roman"><o:p></o:p></span></p>
答案 0 :(得分:1)
content = x.string
然后content.insert_before(new_tag)
就是你的问题。
if not x.isspace():
new_tag = soup.new_tag("span")
x.insert_before(new_tag)
soup.body.childGenerator()
会返回bs4.element
的列表。它们能够执行复杂的操作,例如您尝试执行的插入操作。
这是你的函数recursiveChildren
得到的参数x
。因此x
能够insert_before
。
但在执行content = x.string
时,您在content
内存储了一个简单的HTML字符串(python中的str
类型)。显然字符串不支持insert_before
- 您必须在x
上执行此操作。
顺便说一下,你应该看看PEP8 - recursiveChildren
会更好地命名为recursive_children
而x
是一个错误的变量名称,你应该将它命名为{{1或类似的东西。