1

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

例如,我有以下内容:

HTML

<p>Lorem <strong>ipsum </strong>dolor 坐...</p>

这被解释为:

文本

Lorem ipsum dolor 坐...

现在我想在Text内的特定位置插入一个字符串元素:

Lorem ipsum d <insertion>olor 坐...

这是在字符串索引处:13

关于插入的位置应该32在我的HTML中,因为有 HTML-Tags: <p><strong></strong>也必须计算才能在HTML中找到正确的位置。

我只有这些信息:

  • 文本作为字符串(这意味着没有任何标签)
  • 文本作为 HTML
  • 必须放置插入的文本字符串的索引(13在我的示例中)

解决方案应该在Python. 我玩过这个BeautifulSoap模块,但没有找到在元素内的特定索引处插入文本的方法。

希望有人可以帮助我。提前谢谢了!

4

1 回答 1

3

正如我从您的问题中得到的那样,您想在 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:]

该函数计算作为“字符串”参数传递给函数的 HTML 字符串中不在 HTML 标记内的字符数。当您点击作为“位置”参数传递给函数的数字时,计数循环将中断,函数将在您指定的位置拆分字母后面的字符串。然后它将在这些部分之间插入 insstr 字符串并返回新字符串。如果提供的索引大于文本的长度,它将引发错误。

编辑:正如 JF 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:]

不是很干净的代码,但应该足够容易理解。

于 2012-11-15T14:25:07.223 回答