Как с помощью регулярных выражений выбрать текст из HTML, который не находится внутри определенного тега?

Всем привет! <br/> <br/> Как с помощью регулярного выражения выбрать определенное слово (например, "Bear"), которое не находится внутри определенного тега? <br/> <br/> Необходимо найти слово "Bear", которое не заключено в теги и не находится внутри тегов IMG или A. <br/> <br/> <pre><code>&lt;div class="main"&gt;
&lt;div class="text"&gt;
People give small gifts or &lt;a href=""&gt;bear big max&lt;/a&gt; they exchange cards and love letters that express their feelings. 
The small present can be a bunch of flowers, chocolate, a teddy bear or jewelry and a dinner in 
i a restaurant. It really depends on the people, their tastes, 
imagination and financial &lt;img src="/image/bear.jpg" alt="teddy bear or jewelry"/&gt; opportunities.
&lt;/div&gt;
&lt;/div&gt;</code></pre>
  • 28 ноября 2024 г. 13:53
Ответы на вопрос 1
Использовать регулярные выражения для выборки текста из HTML может быть затруднительно из-за сложности и многообразия структур HTML. Тем не менее, если вы уверены в структуре вашего HTML, можно использовать регулярные выражения для поиска отдельных слов вне определённых тегов.

Для вашего примера, чтобы выбрать слово "bear", которое не находится в тегах `<a>` или `<img>`, можно использовать следующий подход:

```python
import re

html_content = '''
<div class="main">
<div class="text">
People give small gifts or <a href="">bear big max</a> they exchange cards and love letters that express their feelings. 
The small present can be a bunch of flowers, chocolate, a teddy bear or jewelry and a dinner in 
a restaurant. It really depends on the people, their tastes, 
imagination and financial <img src="/image/bear.jpg" alt="teddy bear or jewelry"/> opportunities.
</div>
</div>
'''

# Регулярное выражение для поиска слова "bear" вне тегов <a> и <img>
pattern = r'(?<!<a[^>]*>[^<]*|<img[^>]*>[^<]*)\bbear\b(?![^<]*</a>|[^<]*</img>)'

matches = re.findall(pattern, html_content, re.IGNORECASE)
print(matches)
```

### Объяснение регулярного выражения:

- `(?<!<a[^>]*>[^<]*|<img[^>]*>[^<]*)` — негативный просмотр назад (negative lookbehind): проверяет, что перед словом "bear" нет открывающего тега `<a>` или `<img>`, за которым не следует открывающий тег.
  
- `\bbear\b` — ищет слово "bear" с границами слова.

- `(?![^<]*</a>|[^<]*</img>)` — негативный просмотр вперёд (negative lookahead): проверяет, что за словом "bear" нет закрывающего тега `</a>` или `</img>`.

### Важно:
Использование регулярных выражений для анализа HTML-страниц не всегда надёжно в силу потенциальной сложности HTML. Рекомендуется использовать специализированные библиотеки для разбора HTML, такие как BeautifulSoup в Python, если это возможно. В случае HTML с неправильной структурой регулярные выражения могут привести к неверным результатам.
Похожие вопросы