使用Python将div元素中的文本位置计算到HTML中相应的位置

使用Python将div元素中的文本位置计算到HTML中相应的位置,python,html-parsing,beautifulsoup,Python,Html Parsing,Beautifulsoup,我需要找到一种方法,将div元素中文本的位置(即字符位置的索引)计算到HTML代码的相应位置。这是必要的,因为我必须能够在不丢失格式的情况下在该位置插入元素 例如,我有以下几点: HTML Loremipsumdolor-sit… 这被解释为: 文本 Loremipsumdolor-sit 现在,我想在文本中的特定位置插入一个string元素: Loremipsumdolor坐 这是字符串索引:13 关于这一点,在myHTML中插入的位置应该是32,因为有HTML标记:,,,也必须对其进行计数,

我需要找到一种方法,将div元素中文本的位置(即字符位置的索引)计算到HTML代码的相应位置。这是必要的,因为我必须能够在不丢失格式的情况下在该位置插入元素

例如,我有以下几点:

HTML

Lorem
ipsum
dolor-sit…

这被解释为:

文本

Loremipsumdolor-sit

现在,我想在文本中的特定位置插入一个string元素:

Loremipsumd
olor坐

这是字符串索引:
13

关于这一点,在myHTML中插入的位置应该是
32
,因为有HTML标记:
,也必须对其进行计数,以便在HTML中找到正确的位置

我只有这些信息:

  • 文本为字符串(表示没有任何标记)
  • 文本格式为HTML
  • 必须插入的文本字符串索引(在我的示例中是
    13
解决方案应该在
Python
中。我使用了
BeautifulSoap
模块,但没有找到在元素中的特定索引处插入文本的方法


希望有人能帮我。非常感谢

我从你的问题中了解到,你想在一个字母后面插入HTML代码中的内容,你知道该字母的索引是明文的。如果是这样,我认为最简单的解决方案是忽略所有html标记,只计算它们之外的字母。 你可以这样做:

def insertInHtml(string, insstr, position):
    ctr=0
    insidetag=False
    for ci in range(len(string)):
        if string[ci]=='<':
            insidetag=True
        elif string[ci]=='>':
            insidetag=False
        else:
            if not insidetag: ctr+=1
        if ctr==position+1:
            HTMLIndex=ci
            break
    return string[0:HTMLIndex] + insstr + string[HTMLIndex:]
def insertInHtml(字符串、insstr、位置):
ctr=0
insidetag=False
对于范围(len(string))中的ci:
如果字符串[ci]='':
insidetag=False
其他:
如果不在标签内:ctr+=1
如果ctr==位置+1:
HTMLIndex=ci
打破
返回字符串[0:HTMLIndex]+insstr+string[HTMLIndex:]
函数统计作为“字符串”参数传递给函数的HTML字符串中不在HTML标记内的字符数。当您点击作为'position'参数传递给函数的数字时,计数循环将中断,函数将在您指定的位置上拆分字母后面的字符串。然后,它将在这些部分之间插入insstr字符串并返回新字符串。如果提供的索引大于文本长度,则会引发错误

编辑:
正如J.F.Sebastian所指出的,如果html有注释,这将失败(如果属性中有文字
>
,或者有注释,以它开头的行将失败。请参阅。好的,我真的不认为这样的大小写是可能的。如果文字在引号内或后跟感叹号和两个破折号,我将编辑函数以忽略该文字
def insertInHtml(string, insstr, position):
    ctr=0
    insidetag=False
    insideattr=False
    for ci in range(len(string)):
        suchar=''
        if not ci==len(string)-1: suchar=string[ci+1]
        if string[ci]=='<' and not insideattr:
            insidetag=True
        elif (string[ci]=='>' and not insideattr) or (string[ci]=='-' and string[ci-2:ci]=='!-'):
            insidetag=False
        elif insidetag and string[ci]+suchar=='="':
            insideattr=True
        elif insideattr and string[ci]=='"':
            insideattr=False
        else:
            if not insidetag: ctr+=1
        if ctr==position+1:
            HTMLIndex=ci
            break
    return string[0:HTMLIndex] + insstr + string[HTMLIndex:]