使用Python将div元素中的文本位置计算到HTML中相应的位置
我需要找到一种方法,将div元素中文本的位置(即字符位置的索引)计算到HTML代码的相应位置。这是必要的,因为我必须能够在不丢失格式的情况下在该位置插入元素 例如,我有以下几点: 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标记:,,,也必须对其进行计数,
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:]