Фильтр Python BeautifulSoup Regex не работает - PullRequest
0 голосов
/ 05 октября 2019

Мне нужно содержимое класса div «hide info-json», родительским классом которого являются теги «info-wrap» или «info-wrap no-meta», но не «info-wrap hide».

Пример HTML:

<li class="info-wrap">
    <div class="hide info-json">
        <p>Content That I Want - JSON Data </p>
    </div>
</li>

<li class="info-wrap hide">
    <div class="hide info-json">
        <p>Content That I Don't Want </p>
    </div>
</li>

<li class="info-wrap no-meta">
    <div class="hide info-json">
        <p>Content That I Want - JSON Data  </p>
    </div>
</li>

Вот мой код:

soup = BeautifulSoup(res.text, "lxml")        
        for divTags in soup.findAll('li', class_ = re.compile('^(?!.*hide).*info-wrap.*$')):
            for infoList in divTags.find_all('div',{'class':'hide info-json'}):
                Curinfo = json.loads(infoList.text)  

, но он ничего не возвращает.

Если я проверю это регулярное выражение на https://regex101.com/r/8yJ5yI/1,, этоработает нормально. Пожалуйста, помогите мне, как это сделать.

Для меня не обязательно использовать регулярные выражения, все, что я хочу, это <p>Content That I Want </p>

Спасибо

Ответы [ 2 ]

0 голосов
/ 05 октября 2019

Использование: not (bs4 4.7.1+) для фильтрации нежелательного класса

import requests
from bs4 import BeautifulSoup as bs

html = '''<li class="info-wrap">
    <div class="hide info-json">
        <p>Content That I Want - JSON Data </p>
    </div>
</li>

<li class="info-wrap hide">
    <div class="hide info-json">
        <p>Content That I Don't Want </p>
    </div>
</li>

<li class="info-wrap no-meta">
    <div class="hide info-json">
        <p>Content That I Want - JSON Data  </p>
    </div>
</li>'''

soup = bs(html, 'lxml')
print([p.text for p in soup.select('.info-wrap:not(.hide) p')])
0 голосов
/ 05 октября 2019
import re

html = """<li class="info-wrap">
    <div class="hide info-json">
        <p>Content That I Want - JSON Data </p>
    </div>
</li>

<li class="info-wrap hide">
    <div class="hide info-json">
        <p>Content That I Don't Want </p>
    </div>
</li>

<li class="info-wrap no-meta">
    <div class="hide info-json">
        <p>Content That I Want - JSON Data  </p>
    </div>
</li>"""

l = re.findall(r"""<li\s+class="info-wrap(\s+no-meta)?"\s*>\s*
               <div\s+class="hide\s+info-json"\s*>
               \s*(.*?)\s*
               </div>\s*
               </li>
               """,html, flags=re.VERBOSE|re.IGNORECASE|re.DOTALL)
l = [item[1] for item in l]
print(l)

Отпечатки:

['<p>Content That I Want - JSON Data </p>', '<p>Content That I Want - JSON Data  </p>']

См. Демонстрацию

...