Форум программистов, компьютерный форум, киберфорум
PowerShell
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.83/6: Рейтинг темы: голосов - 6, средняя оценка - 4.83
0 / 0 / 0
Регистрация: 14.04.2017
Сообщений: 22
1

Удаление лишних строк таблицы, парсер PS

31.10.2018, 06:15. Просмотров 1184. Ответов 6
Метки нет (Все метки)

Здравствуйте! Имеется скрипт парсера некой веб - страницы, содержащую таблицу. Таблица извлечена из тега <table>:
PowerShell
1
2
3
4
$uri = "..."
$data = Invoke-WebRequest $uri
$table = $data.ParsedHtml.getElementsByTagName("table") | Select -First 1
$table | select -ExpandProperty innertext
НО! Внутри тега <table>, помимо основной таблицы, находится Содержание веб страницы (между тегами <ul>). Каким образом можно удалить это содержание, оставив на выходе только содержимое таблицы?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
31.10.2018, 06:15
Ответы с готовыми решениями:

Программное удаление лишних строк таблицы DataGridView
Имеется программа. При считывании из файла таблица заполняется таким образом (рис.1). При нажатии...

Сцепка текста в ячейках, если совпадают значения в столбце А, удаление повторов имен, удаление лишних строк
Добрый день, подскажите, как решить задачу: Есть список организаций с контактами. Одна организация...

Удаление лишних строк - доделать макрос
Приветствую знатоков и прошу помочь доделать код. Есть текстовые данные, разбитые постранично. На...

Удаление лишних строк в reg-файле
Приветствую всех ! К примеру имеется дамп ветки реестра HKLM\SYSTEM\CurrentControlSet\services...

6
770 / 419 / 137
Регистрация: 03.06.2009
Сообщений: 1,223
Записей в блоге: 4
31.10.2018, 10:35 2
Lyrics,
Так получите коллекцию элементов с нужным тэгом tr, тем же самым методом что и таблицу.
И распарсите коллекцию, зачем вам обращать внимание на другие тэги?
PowerShell
1
2
$table = $data.ParsedHtml.getElementsByTagName("table") | Select -First 1
$tr_collection = $table.ParsedHtml.getElementsByTagName("tr")
0
0 / 0 / 0
Регистрация: 14.04.2017
Сообщений: 22
06.11.2018, 04:31  [ТС] 3
Что-то не получается распарсить коллекцию...все равно выводит содержание вместе с таблицей

PowerShell
1
2
3
4
5
$uri = "...."
$data = Invoke-WebRequest $uri
$table = $data.ParsedHtml.getElementsByTagName("table") | Select -First 1
$tr_collection = $table.ParsedHtml.getElementsByTagName("tr")
$table | select -ExpandProperty innertext > 2.txt
Удаление лишних строк таблицы, парсер PS
0
770 / 419 / 137
Регистрация: 03.06.2009
Сообщений: 1,223
Записей в блоге: 4
06.11.2018, 10:13 4
Lyrics, Так вы коллекцию получаете
PowerShell
1
$tr_collection = $table.ParsedHtml.getElementsByTagName("tr")
Но дальше с ней ничего не делаете.
В данном объекте у вас должна быть коллекция элементов с тэгом tr, ее то и надо парсить
0
0 / 0 / 0
Регистрация: 14.04.2017
Сообщений: 22
12.11.2018, 02:47  [ТС] 5
v_svitere, Desktop.rar
0
72 / 63 / 17
Регистрация: 27.02.2016
Сообщений: 285
12.11.2018, 09:21 6
ваша задача на самом деле немного сложнее чем кажется уж очень у вас страница грязная

в качестве примера вот код вытаскивает имя из первой колонки ряда с белым фоном когда в шестой колонке есть емейл



- я на американсой windows работаю поэтому всех иванов назвал просто и со вкусом NAME вот пример стрики котоую хочу:
Код
<tr bgcolor="F0F0F0"><td>**NAME </td><td></td><td align="center">100 </td><td></td><td align="left">зам. директора </td><td></td><td align="left"><a rel="nofollow" class="external text" href="ссылка">ссылка</a>iv@mail.ru </td><td></td><td align="center">+7(922)2365478</td>
</tr>
вот код (отладочная информация убарана):

Код
$datafile = 'data.html'
$uri = ('file:///{0}' -f ((resolve-path $datafile).path -replace '\\', '/'))
[Microsoft.PowerShell.Commands.WebResponseObject]$obj = (Invoke-WebRequest -Uri $uri)
$html = new-object -ComObject 'HTMLFile'
$html.IHTMLDocument2_write($obj.rawContent)
$table = $html.documentElement.getElementsByTagName('table').item(0)

# selecting by color

$length = $table.querySelectorall('tr[bgcolor="#f0f0f0"]').length
write-output ( 'white rows: {0}' -f  $length)
@(0..$length) | foreach-object { 
  $index = $_ 
  $row = $table.querySelectorall('tr[bgcolor="#f0f0f0"]').item($index)
  try {  
    $email = $row.getElementsByTagName('td').item(6)
    if ($email.innerText -match '[a-z0-9_]+@mail.ru' ){
      write-output $email.innerText
      write-output $row.getElementsByTagName('TD').item(0).innerText
    }
  } catch [Exception]{ 
    write-output ( 'Exception : ' + $_.Exception.Message)
  }
}
вот что получается

Код
. .\parse_local_data.ps1

white rows: 16
petrov@mail.ru
  NAME
????????????iv@mail.ru
  NAME
smir@mail.ru
  NAME
sim@mail.ru
  NAME
andr@mail.ru
  NAME
amm@mail.ru
  NAME
ivl@mail.ru
  NAME
suh@mail.ru
  NAME
0
72 / 63 / 17
Регистрация: 27.02.2016
Сообщений: 285
13.11.2018, 09:03 7
если рандомно вместо DOM получаете String[] то попробуйте посмотреть на выбор инструмента.

имею в виду Selenium.. можно использовать из PS...

У Poweshell , Internet Exploer синтаксис обращения с DOM (и не только помоему) уродский неустойчивый и плохо документирован. почему не хотите **нормальным** интсрументом воспользоваться ?
you pick the one right tool
https://getyarn.io/yarn-clip/3... a7dcbeb5bc

Добавлено через 5 часов 53 минуты
я не могу читать 1251 OEM..прикрепленные файлы сильно битые..

я подправил.

в таблице неодинаковое колич. столбцов так что игнорируеч где не 9
и копирую outerHTML (который никогда не пустой) чтобы PS не "соптимизировал" логику когда ячейка пустые и не сделал из 9 5 или 6.
теги можно после чистить когда (если) заработает...

и вместо $Headers[$i] просто "1", "2" ... "9"
и вместо оператора
Код
[$i]=
просто

Код
.item($i)
- не уверен что MDN Javascript дружит с итераторами.


# brute force iteration
Код
$page.getElementsByTagName('table') | forEach-object {
  $headers = $null
  $_.getElementsByTagName('tr') | forEach-object {
    $outputRow = $_.getElementsByTagName('td') | select-object -expandproperty outerHTML
      if ($outputRow.count -ne 9) {
        continue;
      }
      $outputHash = @{
        '0' = '';
        '1' = '';
        '2' = '';
        '3' = '';
        '4' = '';
        '5' = '';
        '6' = '';
        '7' = '';
      }
      if ($outputRow.count -eq 9 ){
      for ($i = 0; $i -lt $outputRow.count; $i ++ ) {
        $OutputHash[('{0}' -f $i)] = $outputRow.item($i)
     }

      }
      # clear
      new-object psobject -property $OutputHash
     $OutputHash | format-list 
  }
}
Код
7 :
    <TD></TD>
2 :
    <TD align=center>100 </TD>
8 :
    <TD align=center>+7(922)2365478</TD>
4 :
    <TD align=left>??????. ?????????????????? </TD>
3 :
    <TD></TD>
0 :
    <TD>&nbsp;&nbsp;NAME </TD>
6 :
    <TD align=left><A class="external text" href="????????????"
    rel=nofollow>????????????</A>iv@mail.ru </TD>
в Selenium / .Net /Linq это было бы немного короче
Код
driver
.FindElements(By.CssSelector("table tr"))
.ToList()
.Where(row => row.FindElements(By.CssSelector("td")).Count == 9)
.ForEach(row => row.FindElements(By.CssSelector("td")) )
.Select(cell => cell.Text).ToList()
- но не совсем так - этот сампл неправильный просто для илл

Добавлено через 13 минут
я сейчас больше заинтересоват в java / streams чем c# / LINQ - недоконца понятно как запаковать итоговый материал...
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
13.11.2018, 09:03

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Упражнение 1.18 Удаление лишних пробелов, табуляций и строк
Упражнение 1.18. Напишите программу, которая будет в каждой вводимой строке заменять стоящие подряд...

Удаление лишних пустых строк и пробелов на конце строки
open(FIL,&quot;azaz.txt&quot;); my @s =&lt;FIL&gt;; close FIL; for ($i=0; $i &lt;= 9; $i++) { if ( length( $s ) &gt;...

Удаление лишних переводов на новую строку с удалением лишних пробелов
Добрый вечер, форумчане! Прошу помочь. Из текста необходимо удалить лишние знаки пробелов и...

Создание программы со своей библиотекой ( удаление элементов с N по M в строке и удаление лишних пробелов(если 2 и более оставить один))
добрый день. помогите, пожалуйста понять мои ошибки в работе. Мне нужно написать программу со...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, vBulletin Solutions, Inc.