1

div要素にあるテキストの位置(つまり、文字位置のインデックス)をHTMLコードの対応する位置に計算する方法を見つける必要があります。フォーマットを失うことなくその位置に要素を挿入できなければならないので、これが必要です。

たとえば、私は次のようにしています。

HTML

<p>Loremipsumdolor<strong>座っ</strong>て...</p>

これは次のように解釈されます:

文章

Loremipsumdolor座って...

次に、テキスト内の特定の位置に文字列要素を挿入します。

Lorem ipsum d <insertion>olor sit .. ..

これはstring-indexにあります:13

これに関しては、挿入の位置は32私のHTML内にある必要があります。これは、HTMLタグ:、、があり<p>HTML内の正しい位置を見つけるためにもカウントする必要があるためです。<strong></strong>

私はそれらの情報しか持っていません:

  • 文字列としてのテキスト(つまり、タグなし)
  • 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タグ内にない「string」引数として関数に渡されるHTML文字列の文字数をカウントします。'position'引数として関数に渡した数値をヒットすると、カウントループが中断し、関数は指定した位置の文字の後ろの文字列を分割します。次に、それらの部分の間にinsstr文字列を挿入し、新しい文字列を返します。指定されたインデックスがテキストの長さより大きい場合、エラーが発生します。

編集:JFセバスティアンが指摘したように、htmlの属性にコメント(<で始まる行、感嘆符、2つのダッシュ)またはリテラル<がある場合、これは失敗します。両方のケースを処理する関数は次のとおりです。

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 に答える