Найти все между двумя тегами HTML в Python - PullRequest
0 голосов
/ 08 октября 2019

Я хочу получить текст, который будет в первом списке <ul> после заголовка в <b>, который будет содержать ключевое слово, например:

<b> anything </b>
<p> KEYWORD </p> 
<b> anything </b>
<b> anything KEYWORD anything </b> #this is the title that I want
<some tag> anything <some tag>
<ul> 
# this is the TEXT what I want 
</ul>

То, что я хочу, этоRE рассматривает только текст, который находится в третьем <b>, но RE, который я написал, получает первое <b>, ключевое слово <p> и второе </b>.

Это мой RE: re.search(r'<b>.*?(' + keyword + ').*?</b>.*?<ul>(.*?)</ul>')

Кто-нибудь может мне помочь?

Ответы [ 2 ]

2 голосов
/ 08 октября 2019

Если бы это был просто текст, сфокусируйтесь на внутреннем <b>..</b>, как это

(?is)<b>(?:(?!</?b>).)*?(keyword)(?:(?!</?b>).)*?</b>.*?<ul>\s*(.*?)\s*</ul>

https://regex101.com/r/3WwDXM/1

Расширенное

 (?is)

 <b>
 (?: (?! </?b> ) .)*?
 ( keyword )                   # (1)
 (?: (?! </?b> ) .)*?
 </b> 

 .*? 

 <ul> \s* 
 ( .*? )                       # (2)
 \s* </ul>
0 голосов
/ 08 октября 2019

Может быть, это будет делать то, что вы хотите извлечь:

from bs4 import BeautifulSoup

html = '''
<b> anything </b>
<p> KEYWORD </p>
<b> anything </b>
<b> anything KEYWORD anything </b> #this is the title that I want
<some tag> anything <some tag>
<ul>
# this is the TEXT what I want
</ul>

<ul>
# this is not the TEXT what I want
</ul>

'''

soup = BeautifulSoup(html, 'html.parser')


b_tags = soup.findAll('b')
ul_tag = soup.find('ul')

desired_keyword = 'KEYWORD'

for b in b_tags:
    if desired_keyword in b.text:
        print(ul_tag.text.strip())

Вывод

# this is the TEXT what I want
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...