Разбор HTML-таблиц в Python с BeautifulSoup

Я пытаюсь получить доступ к данным из второй таблицы и далее, которая находится на вкладке спецификаций, но мой код только возвращает данные из первой таблицы. Из прочтения многих других постов на SO я пришел к следующему, которое не приближается к созданию желаемых списков -

from bs4 import BeautifulSoup
import csv
html = "http://www.carwale.com/marutisuzuki-cars/baleno/sigma12/"
html_content = requests.get(html).text
soup = BeautifulSoup(html_content, "lxml")
table = soup.find("table")


output_rows = []
for table_row in table.findAll('tr'):
    columns = table_row.findAll('td')
    output_row = []
    for column in columns:
        output_row.append(column.text)
    output_rows.append(output_row)

output_rows

Всего 2 ответа


.find() вернет только первый найденный элемент / тег. Вы хотите использовать .find_all() который затем возвращает список всех указанных элементов / тегов.

ОДНАКО, я могу предложить Панд в этой ситуации. .read_html() Pandas использует Beautifulsoup под капотом и ищет эти теги <table> . Затем он возвращает их в виде списка данных. Это просто вопрос выбора позиции индекса таблицы, которую вы хотите. Глядя на сайт, можно увидеть таблицы, возвращенные в позициях индекса 1-4:

import pandas as pd

dfs = pd.read_html('http://www.carwale.com/marutisuzuki-cars/baleno/sigma12/')

result = pd.DataFrame()
for df in dfs[1:5]:
    result = result.append(df, sort=False).reset_index(drop=True)

Выход:

print (result)
                         0                                                  1
0                   Engine  1197cc, 4 Cylinders Inline, 4 Valves/Cylinder,...
1              Engine Type                                                VVT
2                Fuel Type                                             Petrol
3      Max Power (bhp@rpm)                                  82 bhp @ 6000 rpm
4      Max Torque (Nm@rpm)                                  115 Nm @ 4000 rpm
5           Mileage (ARAI)                                         21.01 kmpl
6               Drivetrain                                                FWD
7             Transmission                                   Manual - 5 Gears
8        Emission Standard                                               BS 6
9                   Length                                            3995 mm
10                   Width                                            1745 mm
11                  Height                                            1510 mm
12               Wheelbase                                            2520 mm
13        Ground Clearance                                             170 mm
14             Kerb Weight                                             865 kg
15                   Doors                                            5 Doors
16        Seating Capacity                                           5 Person
17      No of Seating Rows                                             2 Rows
18               Bootspace                                         339 litres
19      Fuel Tank Capacity                                          37 litres
20        Suspension Front                                    McPherson Strut
21         Suspension Rear                                       Torsion Beam
22        Front Brake Type                                               Disc
23         Rear Brake Type                                               Drum
24  Minimum Turning Radius                                         4.9 metres
25           Steering Type                          Power assisted (Electric)
26                  Wheels                                         Steel Rims
27             Spare Wheel                                              Steel
28             Front Tyres                                       185 / 65 R15
29              Rear Tyres                                       185 / 65 R15

Вам нужно выбрать имя класса таблицы, когда вы нацеливаетесь на конкретную таблицу. Попробуйте следующий css селектор

Код:

from bs4 import BeautifulSoup

html = "http://www.carwale.com/marutisuzuki-cars/baleno/sigma12/"
html_content = requests.get(html).text
soup = BeautifulSoup(html_content, "lxml")
tables= soup.select("table.specs:not(.features)")


output_rows = []
for table in tables:
    for table_row in table.findAll('tr'):
        columns = table_row.findAll('td')
        output_row = []
        for column in columns:
           output_row.append(column.text.strip())
        output_rows.append(output_row)

print(output_rows)

Выход :

[['Engine', 񟠝cc, 4 Cylinders Inline, 4 Valves/Cylinder, DOHC'], ['Engine Type', 'VVT'], ['Fuel Type', 'Petrol'], ['Max Power (bhp@rpm)', ྎ bhp @ 6000 rpm'], ['Max Torque (Nm@rpm)', 飋 Nm @ 4000 rpm'], ['Mileage (ARAI)', ད.01 kmpl'], ['Drivetrain', 'FWD'], ['Transmission', 'Manual - 5 Gears'], ['Emission Standard', 'BS 6'], ['Length', 񠌋 mm'], ['Width', 񟩁 mm'], ['Height', 񟥖 mm'], ['Wheelbase', 񟵈 mm'], ['Ground Clearance', 餂 mm'], ['Kerb Weight', 鮹 kg'], ['Doors', Ƌ Doors'], ['Seating Capacity', Ƌ Person'], ['No of Seating Rows', ƈ Rows'], ['Bootspace', 馫 litres'], ['Fuel Tank Capacity', ཡ litres'], ['Suspension Front', 'McPherson Strut'], ['Suspension Rear', 'Torsion Beam'], ['Front Brake Type', 'Disc'], ['Rear Brake Type', 'Drum'], ['Minimum Turning Radius', Ɗ.9 metres'], ['Steering Type', 'Power assisted (Electric)'], ['Wheels', 'Steel Rims'], ['Spare Wheel', 'Steel'], ['Front Tyres', 餑 / 65 R15'], ['Rear Tyres', 餑 / 65 R15']]

Есть идеи?

10000