Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  

Показать сообщение отдельно

Аватара для YuS_2

Crazy


Contributor


Сообщения: 1218
Благодарности: 509

Профиль | Отправить PM | Цитировать


Вложения
Тип файла: zip test1.zip
(723 байт, 1 просмотров)

Выдалось время одновременно с желанием понажимать кнопки...
Скрипт теперь "умеет" учитывать и rowspan-ы, и colspan-ы, плюс немного описания:
script.ps1
Код: Выделить весь код
<#
.SYNOPSIS 
	Парсер таблиц .html

.Description
	Скрипт парсит таблицы в формате HTML и записывает данные в формате CSV 
	- для каждой таблицы отдельный файл. Учитываются объединенные ячейки по
	строкам и(или) по колонкам, ROWSPAN и COLSPAN.
	Число колонок определяется автоматически, по тегам TH. Имена заголовков 
	присваиваются из значений элементов TH. При отсутствии тегов TH, число
	колонок определяется по максимальному числу ячеек в строках, при этом 
	наименование заголовков	будет формироваться автоматически, с префиксом
	'H' и с номерами по порядку.
	Размеры строк таблицы должны быть в пределах количества заголовков, т.е.
	структура таблицы должна быть правильной, в том числе, с учетом ROWSPAN
	и COLSPAN 

.Parameter Infile
	Обязательный: Указывается файл в котором необходимо распарсить таблицу(ы)

.Parameter Outfile
	Необязательный: Имя для выходных файлов .csv. Указывается только имя, без
	расширения. К имени будет добавлен номер таблицы по порядку.

.Example
	.\script.ps1 -Infile 'test.html'
	
.Example
	.\script.ps1 -Infile 'test.html' -Outfile 'd:\folder\name_file'

.Example
	.\script.ps1 'test.html' 'name_file'

.Example
	.\script.ps1

.Notes
	Created By YuS
	Version: 1.02
	Date: 16/04/2020
	Purpose/Change:	Устранение багов кода. Исключение вложенных таблиц.
	Version: 1.01
	Date: 06/04/2020
	Purpose/Change:	Оптимизирован алгоритм чтения ячеек. Удален лишний цикл и
	буферный счетчик.
	Version: 1.00
	Date: 05/04/2020
	Purpose/Change:	Первая версия

.Link
	http://forum.oszone.net/showpost.php?p=2915883&postcount=25
#>

param (
	#[parameter(Mandatory=$true)]
	[string]$infile= 'test1.html',
	[string]$outfile = 'table'
)

measure-command{

$html = new-object -com "HTMLFile"
$html.ihtmldocument2_write($(gc $infile -raw -enc utf8))
$tables = $html.getelementsbytagname("table")

# Исключение вложенных таблиц:
$tables|?{($_.getelementsbytagname('table')|%{$_}).count -eq 0}|%{$n=0}{
# Обработка всех элементов TABLE, включая вложенные (вероятна ошибка структуры таблицы). 
# Необходимо закомментировать строку кода выше и раскомментировать эту:
#$tables|%{$n=0}{
	$headers = @();$n++
	$tr = $_|%{$_.getelementsbytagname("tr")}
	if($headers = $tr|?{$_.firstchild().tagname -eq 'th'}|
	%{$_.getelementsbytagname("th")}|select -exp innertext){
		$headers = $headers.trim()
 	} else {
		$headers = 1..([linq.parallelenumerable]::max(
			[linq.parallelenumerable]::asparallel($tr.lastchild().cellindex)
		)+1)|%{"H$_"}
	}
	$rowind = ,1 * $headers.count
	$tr.where({$_.firstchild().tagname -eq 'td'})|%{
		$row = $_.getelementsbytagname("td") | select innertext,rowspan,colspan
		try {
			$str = [ordered]@{}
			$k=0
			foreach ($item in $row){
				if ($rowind[$k] -gt 1){
					while ($rowind[$k] -gt 1){
						$str[$headers[$k]] = $null
						$rowind[$k] -= 1
						$k++
					}
				}
				if (($colspan = $item.colspan) -gt 1) {
					$str[$headers[$k]] = if($item.innertext){
						$item.innertext.trim()
					} else {$null}
					if ($item.rowspan -gt 1){$rowind[$k] = $item.rowspan}
					$k++
					while ($colspan -gt 1){
						$str[$headers[$k]] = $null
						$colspan -=1
						if ($rowind[$k] -gt 1){$rowind[$k]-=1}
						$k++
					}
				} else {
					$str[$headers[$k]] = if($item.innertext){
						$item.innertext.trim()
					} else {$null}
					if ($item.rowspan -gt 1){$rowind[$k] = $item.rowspan}
					$k++
				}
			}
			[pscustomobject]$str
		} catch {
			write-host Разметка заголовков не соответствует размерам строк -for red
			write-host $_ -for cyan
		}
	} |export-csv $($outfile+"_"+$n+'.csv') -notype -enc utf8 -d ';'
}

} #|out-file time.txt -enc utf8

1. Оптимизировать алгоритм чтения ячеек не удалось, но кое-что оптимизировано.
2. Объемные таблицы, всё также обрабатываются не быстро.
3. Парсит все имеющиеся таблицы в dom-структуре.
Вдруг кому-то ещё пригодится...

-------
scio me nihil scire. Ѫ


Последний раз редактировалось YuS_2, 16-04-2020 в 18:49. Причина: новая версия, немного оптимизации

Это сообщение посчитали полезным следующие участники:

Отправлено: 13:34, 05-04-2020 | #25