如何使用python在html中的字符串前插入标记

时间:2017-07-28 08:20:36

标签: python html beautifulsoup

我找到了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>

1 个答案:

答案 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_childrenx是一个错误的变量名称,你应该将它命名为{{1或类似的东西。

Explicit is better than implicit