Python таблица раскраски BeautifulSoup
Я изучаю python requests
и BeautifulSoup. Для упражнения я решил написать быстрый парсинг парковочного парцелла NYC. Я могу получить html-ответ, который довольно уродлив. Мне нужно захватить lineItemsTable
и разобрать все билеты.
Вы можете воспроизвести страницу, перейдя сюда: https://paydirect.link2gov.com/NYCParking-Plate/ItemSearch
и введя табличку NY
T630134C
soup = BeautifulSoup(plateRequest.text)
#print(soup.prettify())
#print soup.find_all('tr')
table = soup.find("table", { "class" : "lineItemsTable" })
for row in table.findAll("tr"):
cells = row.findAll("td")
print cells
Кто-нибудь может помочь мне? Простой поиск всех tr
не приводит меня никуда.
Ответы
Ответ 1
Здесь вы идете:
data = []
table = soup.find('table', attrs={'class':'lineItemsTable'})
table_body = table.find('tbody')
rows = table_body.find_all('tr')
for row in rows:
cols = row.find_all('td')
cols = [ele.text.strip() for ele in cols]
data.append([ele for ele in cols if ele]) # Get rid of empty values
Это дает вам:
[ [u'1359711259', u'SRF', u'08/05/2013', u'5310 4 AVE', u'K', u'19', u'125.00', u'$'],
[u'7086775850', u'PAS', u'12/14/2013', u'3908 6th Ave', u'K', u'40', u'125.00', u'$'],
[u'7355010165', u'OMT', u'12/14/2013', u'3908 6th Ave', u'K', u'40', u'145.00', u'$'],
[u'4002488755', u'OMT', u'02/12/2014', u'NB 1ST AVE @ E 23RD ST', u'5', u'115.00', u'$'],
[u'7913806837', u'OMT', u'03/03/2014', u'5015 4th Ave', u'K', u'46', u'115.00', u'$'],
[u'5080015366', u'OMT', u'03/10/2014', u'EB 65TH ST @ 16TH AV E', u'7', u'50.00', u'$'],
[u'7208770670', u'OMT', u'04/08/2014', u'333 15th St', u'K', u'70', u'65.00', u'$'],
[u'$0.00\n\n\nPayment Amount:']
]
Несколько замечаний:
- Последняя строка в выводе выше, Сумма платежа не является частью
таблицы, но именно так выкладывается таблица. Вы можете отфильтровать его
если длина списка меньше 7.
- Последний столбец каждой строки должен обрабатываться отдельно, поскольку это текстовое поле ввода.
Ответ 2
Решено, вот как ваш анализ их результатов html:
table = soup.find("table", { "class" : "lineItemsTable" })
for row in table.findAll("tr"):
cells = row.findAll("td")
if len(cells) == 9:
summons = cells[1].find(text=True)
plateType = cells[2].find(text=True)
vDate = cells[3].find(text=True)
location = cells[4].find(text=True)
borough = cells[5].find(text=True)
vCode = cells[6].find(text=True)
amount = cells[7].find(text=True)
print amount
Ответ 3
Вот рабочий пример для универсального <table>
. (вопрос не работает)
Извлечение таблицы из здесь стран по ВВП (валовой внутренний продукт).
htmltable = soup.find('table', { 'class' : 'table table-striped' })
# where the dictionary specify unique attributes for the 'table' tag
Функция tableDataText
анализирует html-сегмент, начинающийся с тега <table>
, за которым следуют несколько тегов <tr>
(строки таблицы) и внутренних тегов <td>
(данные таблицы). Возвращает список строк с внутренними столбцами. Принимает только один <th>
(заголовок таблицы/данные) в первой строке.
def tableDataText(table):
rows = []
trs = table.find_all('tr')
headerow = [td.get_text(strip=True) for td in trs[0].find_all('th')] # header row
if headerow: # if there is a header row include first
rows.append(headerow)
trs = trs[1:]
for tr in trs: # for every table row
rows.append([td.get_text(strip=True) for td in tr.find_all('td')]) # data row
return rows
Используя его, мы получаем (первые две строки).
list_table = tableDataText(htmltable)
list_table[:2]
[['Rank',
'Name',
"GDP (IMF '19)",
"GDP (UN '16)",
'GDP Per Capita',
'2019 Population'],
['1',
'United States',
'21.41 trillion',
'18.62 trillion',
'$65,064',
'329,064,917']]
Это можно легко преобразовать в pandas.DataFrame
для более продвинутых инструментов.
dftable = pd.DataFrame(list_table[1:], columns=list_table[0])
dftable.head(4)
![pandas DataFrame html table output]()