Удаление данных из таблицы со скрытыми и видимыми строками

#python #html #selenium #web-scraping

Вопрос:

Я пытаюсь очистить этот сайт с помощью Селена. Мой код может загрузить нужную мне таблицу, но когда я пытаюсь извлечь данные, я не могу извлечь данные из скрытых строк, даже если данные видны в HTML.

Это краткое описание таблицы HTML:

 <tbody>
    <tr style="">
        <td class="footable-first-column">
            <span class="footable-toggle">
                **column 1 data**
            </span>
        </td>
        <td> **column 2 data**</td>
        .
        . More data
        .
    </tr>
    .
    . More Visible rowas
    .
    <tr style="display: none;">
        .
        . Same data structure
        .
    </tr>
</tbody>
 

Это код, который я использую, чтобы открыть таблицу и записать данные в csv-файл:

 # Find search year button
searchYearButton = driver.find_element_by_id('searchYearButton')
# Click button
searchYearButton.click()

driver.implicitly_wait(3)

# Find Form
searchForm = driver.find_element_by_css_selector("form[id='searchVehicleForm']")
# Find search inventory button
searchInventoryButton = driver.find_element_by_css_selector("input[value='Search']")
# Click search inventory button
searchInventoryButton.click()

driver.implicitly_wait(3)

# Pull data from tables
table = driver.find_element_by_xpath("//*[@id='vehicletable1']/tbody")

with open('tableOut.csv', 'w', newline='') as csvfile:
    wr = csv.writer(csvfile)
    for row in table.find_elements_by_css_selector('tr'):
        wr.writerow([d.text for d in row.find_elements_by_css_selector('td')])
 

Вывод содержит только данные из видимых строк таблицы. Остальное-пустые данные через запятую. Вот результат:

 2008,CAMRY,12-31-20,309,SILVER,UG029258,109000,4T1CE30P88U763171
2006,IMPALA,12-07-20,406,BLACK,UG028769,Unknown,2G1WC581469163771
1999,ASTRO,09-30-21,210,WHITE,UG034230,Unknown,1GNDM19WXXB186932
1999,RAV4,09-30-21,316,BLACK,UG034232,Unknown,JT3HP10V5X7109589
2002,CAMRY,09-30-21,316,TAN,UG034236,170168,JTDBE32K620095807
2002,PRIZM,09-30-21,412,GREEN,UG034233,Unknown,1Y1SK54892Z414890
1999,CR-V,09-30-21,316,GREEN,UG034229,203216,JHLRD1866XC051024
2006,TRAILBLAZER,09-30-21,210,MAROON,UG034228,Unknown,1GNDS13S362234605
2007,VOLVO 70 SERIES,09-30-21,316,WHITE,UG034225,Unknown,YV1SW612172625431
2005,EQUINOX,09-30-21,412,BLACK,UG034223,Unknown,2CNDL23FX56129877
,,,,,,,
,,,,,,,
,,,,,,,
.
.
.
,,,,,,,
 

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

Ответ №1:

Я смог использовать функцию execute_script для удаления style="display:none" из каждого элемента. Похоже, что нет способа удалить их все сразу, поэтому они удаляются по отдельности.

Это код, который я использовал:

 with open('tableOut.csv', 'w', newline='') as csvfile:
    wr = csv.writer(csvfile)
    for row in table.find_elements_by_css_selector('tr'):
        driver.execute_script("arguments[0].removeAttribute('style')", row)
        wr.writerow([d.text for d in row.find_elements_by_css_selector('td')])