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

时间:2012-11-15 12:10:22

标签: python html-parsing beautifulsoup

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

例如,我有以下内容:

HTML

  

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

被解释为:

文字

  

Lorem ipsum dolor坐......

现在我想在文本中的特定位置插入一个字符串元素:

  

Lorem ipsum d <insertion> olor sit ...

这是在字符串索引:13

关于插件的位置应该在我的 HTML 32,因为有HTML标签:<p><strong>,{{ 1}}必须计算在 HTML 中找到正确的位置。

我只有那些信息:

  • text as string(表示没有任何标签)
  • text as HTML
  • 必须放置插入的文本字符串的索引(在我的示例中是</strong>

解决方案应该在13。我使用Python模块,但没有找到在元素内的特定索引处插入文本的方法。

希望有人可以帮助我。非常感谢提前!

1 个答案:

答案 0 :(得分: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标记内的“字符串”参数。当你点击作为'position'参数传递给函数的数字时,计数循环将中断,函数将把字符串拆分到你指定位置的字母后面。然后它将在这些部分之间插入insstr字符串并返回新字符串。如果提供的索引大于文本的长度,则会引发错误。

编辑: 正如J. F. Sebastian所指出的那样,如果html有注释(以&lt ;,感叹号和两个破折号开头的行)或文字&lt;在属性中。以下是处理这两种情况的函数:

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:]

代码不是很干净,但应该可以理解。