【问题标题】:Calculate a text-position inside a div element into the according position in HTML with Python使用 Python 计算 div 元素内的文本位置到 HTML 中的相应位置
【发布时间】:2012-11-15 12:10:21
【问题描述】:

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

例如,我有以下内容:

HTML

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

解释为:

文字

Lorem ipsum dolor sit...

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

Lorem ipsum d<insertion>olor sit...

这是在字符串索引处:13

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

我只有这些信息:

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

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

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

【问题讨论】:

    标签: python html-parsing beautifulsoup


    【解决方案1】:

    正如我从您的问题中得到的那样,您想在 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 字符串并返回新字符串。如果提供的索引大于文本的长度,它将引发错误。

    编辑: 正如 J. F. Sebastian 所指出的,如果 html 有 cmets(以

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

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

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-05-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-26
    相关资源
    最近更新 更多