Очистка <span>потока с BeautifulSoup - PullRequest
2 голосов
/ 14 июля 2020

Я работаю над очисткой данных с веб-сайта с помощью BeautifulSoup. Кажется, я не могу найти способ распечатать текст между элементами диапазона. Ниже представлена ​​структура.

<span class="greyText smallText">
                avg rating 4.02 —
                132,623 ratings  —
                published 2014
              </span>
<span class="greyText smallText">
                avg rating 4.03 —
                82,319 ratings  —
                published 2015
              </span>

Мне нужно найти средние оценки и оценки отдельно.

import requests
from bs4 import BeautifulSoup as bs

url= "https://someurl"
page = requests.get(url) 
soup = bs(page.content, 'html.parser')
print(soup)
ratings = soup.find_all('span', attrs={'class': 'greyText smallText'})

Ответы [ 2 ]

1 голос
/ 14 июля 2020

Альтернативное решение: вы можете использовать модуль re для извлечения средних оценок:

import re
from bs4 import BeautifulSoup

txt = '''<span class="greyText smallText">
                avg rating 4.02 —
                132,623 ratings  —
                published 2014
              </span>
<span class="greyText smallText">
                avg rating 4.03 —
                82,319 ratings  —
                published 2015
              </span>'''

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

for span in soup.select('span.greyText.smallText'):
    avg_rating = re.search(r'avg rating ([\d.]+)', span.text)
    if avg_rating:
        print(avg_rating[1])

Печать:

4.02
4.03
0 голосов
/ 14 июля 2020
In [32]: [i.text.strip() for i in soup.find_all("span",class_="greyText smallText")]
Out[32]:
['avg rating 4.02 —\n                132,623 ratings  —\n                published 2014',
 'avg rating 4.03 —\n                82,319 ratings  —\n                published 2015']

Отдельные рейтинги Значение:

In [48]: [i.text.strip().split("\n")[0] for i in soup.find_all("span",class_="greyText smallText")]
Out[48]: ['avg rating 4.02 —', 'avg rating 4.03 —']
...