Очистить значения внутри класса span с помощью Python Beautifulsoup - PullRequest
0 голосов
/ 17 сентября 2018

Я пытаюсь очистить данные внутри класса span и поместить их в DataFrame с помощью Beautifulsoup.До сих пор мне удалось добраться до нужного места на веб-странице.Но, кажется, не может быть в состоянии очистить ключевые слова и цифры рядом с "Счастье", "Печаль".

<span class="text-border tooltips" data-original-title="Happiness 84%
 Sadness 80%
 " data-placement="left" data-toggle="tooltip">More stats</span>,
 <span class="text-border tooltips" data-original-title="Happiness 70%
 Sadness 59%
 " data-placement="left" data-toggle="tooltip">More stats</span>

Было бы очень полезно, если бы кто-то мог помочь мне разобраться, чтобы очистить все числа рядом сСчастье и грусть, и пусть они как столбцы в панде DataFrame.

Большое спасибо

Ответы [ 2 ]

0 голосов
/ 17 сентября 2018

Если гарантируется, что все промежутки будут иметь заголовок data-original-title ... и если заголовок всегда будет в формате "Happiness<SPACE><PERCENTAGE><NEW LINE>Sadness<SPACE><PERCENTAGE>", тогда вам подойдет следующее.

>>> import itertools
>>> import re
>>> import pandas as pd
>>> import bs4
>>> html = """<span class="text-border tooltips" data-original-title="Happiness 84%
...  Sadness 80%
...  " data-placement="left" data-toggle="tooltip">More stats</span>,
...  <span class="text-border tooltips" data-original-title="Happiness 70%
...  Sadness 59%
...  " data-placement="left" data-toggle="tooltip">More stats</span>"""
>>> soup = bs4.BeautifulSoup(html, 'lxml')
>>> all_rows = []
>>> for span in soup.find_all('span'):
...     title_eles = re.split(' |\n', span['data-original-title'])
...     title_eles = list(filter(None, title_eles))
...     row = dict(itertools.zip_longest(title_eles[::2], title_eles[1::2], fillvalue=""))
...     all_rows.append(row)
...
>>> pd.DataFrame(all_rows)
  Happiness Sadness
0       84%     80%
1       70%     59%

Также причина, по которой soup.find_all(class_='data-original-title') возвращает пустое значение, заключается в том, что data-original-title является атрибутом в вашем HTML. Это не класс.

0 голосов
/ 17 сентября 2018

Вы могли бы сделать что-то вроде

from bs4 import BeautifulSoup

s = """
<span class="text-border tooltips" data-original-title="Happiness 84%
 Sadness 80%
 " data-placement="left" data-toggle="tooltip">More stats</span>,
 <span class="text-border tooltips" data-original-title="Happiness 70%
 Sadness 59%
 " data-placement="left" data-toggle="tooltip">More stats</span>
"""

soup = BeautifulSoup(s, "lxml")
spans = soup.find_all("span") #get all spans
for span in spans:
    data = span["data-original-title"].split("\n") #get attr and split by \n 
    happiness = data[0][:-1].replace("Happiness ", "") #remove % and remove words
    sadness = data[1][:-1].replace("Sadness ", "")
    print("{} {}".format(happiness, sadness))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...