Как нарезать HTML в dataframe - PullRequest
       8

Как нарезать HTML в dataframe

0 голосов
/ 26 октября 2018
from bs4 import BeautifulSoup
import re
import pandas as pd
import os
soup_level1=BeautifulSoup(driver.page_source, 'lxml')

После импорта некоторого HTML (например, http://www.espncricinfo.com/series/18886/scorecard/1157372/), я понял, что то, что должно быть таблицей ', на самом деле не является таблицей, и поэтому мне кажется, что мне нужно создать таблицу обратно самостоятельно.

Batsmen = soup_level1.find_all('div',class_="cell batsmen")
pd.Series(Batsmen)

0     <div class="cell batsmen" data-reactid="182">B...
1     <div class="cell batsmen" data-reactid="191"><...
...
18    <div class="cell batsmen" data-reactid="541"><...
dtype: object

Я могу извлечь имя Бэтсмена, используя:

FirstBat = Batsmen[1]
FirstBat = str(FirstBat)
FirstBat = pd.Series(FirstBat)
FirstBat = FirstBat.str.split(pat = ">",expand=True)
FirstBat = FirstBat[2]
FirstBat

0    S Dhawan</a
Name: 2, dtype: object

Затем я хочу иметь возможность присоединить имя игрока с битой к его статистике, но статистика [0: 4] относится к заголовкам, а статистика [5:10] относится к первым игрокам с битами:

Stats = soup_level1.find_all('div',class_="cell runs")
pd.Series(Stats)
0     <div class="cell runs" data-reactid="184">R</div>
1     <div class="cell runs" data-reactid="185">B</div>
2     <div class="cell runs" data-reactid="186">4s</...
3     <div class="cell runs" data-reactid="187">6s</...
4     <div class="cell runs" data-reactid="188">SR</...
5     <div class="cell runs" data-reactid="194">4</div>
6     <div class="cell runs" data-reactid="195">8</div>
7     <div class="cell runs" data-reactid="196">1</div>
8     <div class="cell runs" data-reactid="197">0</div>
9     <div class="cell runs" data-reactid="198">50.0... 
...
94    <div class="cell runs" data-reactid="548">-</div>
Length: 95, dtype: object

Каков наилучший подход, чтобы иметь возможность добавить что-то похожее на это?

    Batsmen  R  B  4s  6s    SR
0  S Dhawan  4  8   0   0  50.0

1 Ответ

0 голосов
/ 26 октября 2018

Что-то, с чего можно начать:

from bs4 import BeautifulSoup
import numpy as np
import requests

html_doc= requests.get(r'http://www.espncricinfo.com/series/18886/scorecard/1157372/').content
soup = BeautifulSoup(html_doc, 'html.parser')

data = []
for div in soup.find_all('div',class_="cell runs"):
    data.append(div.text)

np.array(data).reshape(-1,5)

Что выводит

array([['R', 'B', '4s', '6s', 'SR'],
       ['14', '12', '2', '0', '116.66'],
       ['68', '55', '5', '1', '123.63'],
       ['39', '30', '2', '2', '130.00'],
       ['2', '3', '0', '0', '66.66'],
       ['9', '6', '1', '0', '150.00'],
       ['0', '1', '0', '0', '0.00'],
       ['0', '2', '0', '0', '0.00'],
       ['1', '2', '0', '0', '50.00'],
       ['0', '1', '0', '0', '0.00'],
       ['17', '8', '2', '1', '212.50'],
       ['R', 'B', '4s', '6s', 'SR'],
       ['0', '3', '0', '0', '0.00'],
       ['4', '2', '1', '0', '200.00'],
       ['14', '15', '2', '0', '93.33'],
       ['2', '7', '0', '0', '28.57'],
       ['0', '2', '0', '0', '0.00'],
       ['1', '3', '0', '0', '33.33'],
       ['19', '23', '2', '0', '82.60'],
       ['34', '29', '6', '0', '117.24'],
       ['3', '7', '0', '0', '42.85'],
       ['6', '3', '1', '0', '200.00'],
       ['2', '7', '0', '0', '28.57']], dtype='<U6')

И оттуда на самом деле не так уж сложно вставить это во фрейм данных.Вы должны быть осторожны, хотя, поскольку это читает более одной таблицы, вы можете увидеть вторую строку заголовка (т.е. ['R', 'B', '4s', '6s', 'SR']) на полпути, поэтому вам нужно решить, что с этим делать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...