Я обрабатываю HTML с веб-сканера, используя BeautifulSoup. HTML-код запускается через фильтры, которые «упрощают» HTML-код, удаляя и заменяя теги, так что документ содержит только теги <html>
, body
, <div>
и <a>
и видимый текст.
В настоящее время у меня есть функция, которая в настоящее время извлекает URL-адреса и текст привязки с этих страниц. В дополнение к этому, я хотел бы также извлечь N «контекстных слов», предшествующих и следующих за тегом <a>
для каждой ссылки. Например, если у меня есть следующий документ:
<html><body>
<div>This is <a href="www.example.com">a test</a>
<div>There was a big fluffy dog outside the <a href="www.petfood.com">pet food store</a> with such a sad face.<div>
</div>
</body></html>
Тогда, если N = 8, я хочу получить следующие 8 "контекстных слов" для каждой ссылки:
'www.example.com' --> ('This', 'is', 'There', 'was', 'a', 'big', 'fluffy', 'dog')`
'www.petfood.com' --> ('fluffy', 'dog', 'outside', 'the', 'with', 'such', 'a', 'sad')
Первая ссылка (www.example.com
) имеет только два слова, предшествующих перед началом начала документа, поэтому возвращаются эти два слова, а также 6 после тега <a>
, в результате чего получается N=8
. Также обратите внимание, что возвращаемые слова пересекают границу тега <a>
, содержащего <div>
.
Вторая ссылка (www.petfood.com
) имеет N\2
= 4 слова перед ней и 4 после нее, поэтому они возвращаются в качестве контекста. То есть, если возможно, N слов разделяются между предыдущими и теми, которые следуют за тегом <a>
.
Я знаю, как это сделать, если текст находится в том же <div>
, что и ссылка, но я не могу понять, как сделать это через <div>
границы, подобные этой. По сути, для извлечения «контекстных слов» я хочу обработать документ так, как если бы он был просто единым блоком видимого текста со ссылками, игнорируя содержащий div.
Как можно извлечь текст, окружающий теги <a>
, как это, используя BeautifulSoup? Для простоты я даже был бы удовлетворен ответом, который просто возвращает N символов видимого текста перед / после тега (и я могу просто справиться с токенизацией / разбиением себя).