извлечение данных из сводной таблицы HTML - PullRequest
0 голосов
/ 08 июня 2018

У меня есть пара проблем, которые я пытаюсь решить:1. Столбцы 1-3 могут быть объединенными ячейками, поэтому отсутствуют значения 'td', как я могу заполнить каждую строку, если для этих столбцов не существует td?Кроме того, столбцы 4-7 всегда видны.Один способ, которым я думал об обработке этого, был бы возвратиться назад, чтобы получить столбец 7, 6, 5, 4, и если столбец 3, 2, 1 не существует, чтобы использовать предыдущее значение из предыдущей строки2. В столбце 4 может быть несколько значений и одна или несколько гиперссылок.Мне нужно извлечь текст и все гиперссылки, нажать на них и скачать прикрепленные файлы.

Если есть другой метод, отличный от селена, пожалуйста, дайте мне знать.В конечном итоге эта таблица данных и вложения заполняются в файл Excel.

Python - код Selenium: этот код работает для извлечения каждой строки данных по каждому столбцу в HTML-коде ('td')

table = driver.find_element_by_id('table')  
row = table.find_elements_by_tag_name("tr")
for rows in row: 
    cols = rows.find_element_by_tag_name("td")
    for col in cols:
        print(col.text)

Я приложил HTML-код, извлеченный с помощью Beautiful Soup, чтобы дать вам представление о том, как выглядит таблица.Первая строка таблицы имеет 7 'td', но следующие строки не имеют.HTML Code

ок.Поэтому я сделал следующие улучшения в коде col.Обратный цикл работал отлично!Теперь все мои гиперссылки всегда будут в столбце 4. Теперь мне нужно вычислить столбцы 1-3, чтобы заполнить каждую строку, открыть все гиперссылки и сохранить их в определенной папке на общем диске.Спасибо!

    columncounter = 7
    cols = rows.find_elements_by_tag_name("td")
    for col in reversed(cols):
        print('ColumnNumber = %d' %columncounter)
        print(col.text)
        if columncounter == 4:
            colfour = col.get_attribute('innerHTML')
            colfour2 = col.find_elements_by_tag_name('a')
            for a in colfour2:
                print(a.get_attribute('href'))
    columncounter-=1

1 Ответ

0 голосов
/ 13 июня 2018

Это, вероятно, не лучшее решение, но вот что я сделал, чтобы заставить это работать:

from selenium import webdriver
from win32com.client as win32

xl = win32.gencache.EnsureDispatch('Excel.Application')
xl.Visible = 1
wb = xl.Workbooks.Open('Template.xlsx')
xl.DisplayAlerts = False
ws = wb.Worksheets('Sheet1')
tr = 10   # paste results into row 10 for excel table
for rows in row[1:] #skip header row
    rtxt = rows.text.strip()  #trim text to determine if row is empty
    if rtxt:   # used to determine if rtxt variable for empty row
        columncounter = 7
        cols = rows.find_elements_by_tag_name("td")
        for col in reversed(cols):
            if columncounter == 7:
                col7 = col.text
            elif columncounter == 6: 
                col6 = col.text
            elif columncounter == 5:
                col5 = col.text
            elif columncounter ==4: 
                col4 = col.text
                colfour = col.get_attribute('innerHTML') #get entire cell code
                colfour2 = col.find_elements_by_tag_name('a') 
                for a in colfour2:
                    link = a.get_attribute('href') #extract hyperlink
                    linkh = 'https'
                    if linkh in link:  #only want hyperlinks that start with https
                        for i in link:
                            col8+=i     #extracts multiple link into same variable
            elif columncounter == 3:
                col3 = col.text
            elif columncounter == 2:
                col2 = col.text
            elif columncounter == 1:
                col1 = col.text
            columncounter-=1
        #paste all of the values in column into excel
        dest_cell = ws.Range('A' + str(tr))    
        dest_cell.Value = col1
        dest_cell = ws.Range('B' + str(tr))    
        dest_cell.Value = col2
        dest_cell = ws.Range('C' + str(tr))    
        dest_cell.Value = col3
        dest_cell = ws.Range('D' + str(tr))    
        dest_cell.Value = col4
        dest_cell = ws.Range('E' + str(tr))    
        dest_cell.Value = col5
        dest_cell = ws.Range('F' + str(tr))    
        dest_cell.Value = col6
        dest_cell = ws.Range('G' + str(tr))    
        dest_cell.Value = col7
        dest_cell = ws.Range('H' + str(tr))    
        dest_cell.Value = col8  
        tr+=1   
    else:
        continue   #skip empty rows   

Это добавит значения столбцов 1-3, так как нет никаких значений 'td' длявсе 7 столбцов для каждой строки из-за слияния ячеек в первых 3 столбцах.Затем вставьте каждое значение в файл Excel в качестве дублирующих значений, пока не получите новое значение, извлеченное из col.text для этого столбца на основе columncounter.

...