Есть ли способ найти все индексы определенного тега в строке относительно той же строки с удаленными тегами? - PullRequest
3 голосов
/ 26 мая 2020

У меня есть строка HTML с несколькими тегами <em>...</em>. Мне нужно найти все индексы этих тегов относительно строки, где все теги удалены .

Например:

from bs4 import BeautifulSoup


string = "<em>This</em> is <em>a sample</em> string"
string_without_tags = BeautifulSoup(string, "lxml").text

# [(0, 4), (8, 16)] <=> "This" and "a sample"
print(string_without_tags[:4], ", ", string_without_tags[8:16], sep="")

Думаю, я мог бы просто используйте al oop, но, может быть, есть более эффективный способ сделать то, что мне нужно?

Ответы [ 2 ]

2 голосов
/ 26 мая 2020

Вы можете использовать .find_all(text=True).

Например:

from bs4 import BeautifulSoup

string = "<em>This</em> is <em>a sample</em> string"
soup = BeautifulSoup(string, 'html.parser')

cur, idxs = 0, []
for t in soup.find_all(text=True):
    if t.parent.name == 'em':
        idxs.append((cur, cur+len(t)))
    cur += len(t)
print(idxs)

Печать:

[(0, 4), (8, 16)]
1 голос
/ 26 мая 2020

Если, как подсказывает ваш вопрос, вам нужны индексы только как шаг к извлечению текста из тегов 'em', вы можете просто пропустить этот шаг и извлечь текст напрямую.

from bs4 import BeautifulSoup

string = "<em>This</em> is <em>a sample</em> string"
soup = BeautifulSoup(string, 'html.parser')
print(", ".join([x.get_text() for x in soup.find_all("em")]))

Печать:

This, a sample
...