Что нового

Обработка таблиц в HTML

Vlasssov

Осваивающий
Сообщения
428
Репутация
25
Собственно как средствами AutoIt получить доступ ячейкам произвольной таблицы? Сочинил простейший пример

Код:
<table width="200" border="1">
  <tr>
    <td>Ячейка 1</td>
    <td>Ячейка 2</td>
    <td>Ячейка 3</td>
  </tr>
  <tr>
    <td>Ячейка 4</td>
    <td>Ячейка 5</td>
    <td>Ячейка 6</td>
  </tr>
  <tr>
    <td><b>Ячейка 7</b></td>
    <td>Ячейка 8</td>
    <td>Ячейка 9</td>
  </tr>
</table>
Как получить доступ к ячейку с текстом Ячейка 1, причем найти там определенный фрагмент? Фрагмент-то я сам найду, :laugh:, а вот можно получить доступ к ячейки как к объекту с определенными свойствами?
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8 175
Репутация
2 331
Vlasssov [?]
можно получить доступ к ячейки как к объекту с определенными свойствами?
Как к объекту нет, но можно парсировать текст и получать содержимое каждой ячейки. Пример:

Код:
#include <Array.au3>

$sHtml = ClipGet() ;В буфере обмена содержится таблица, можно заменить на данные с _InetGetSource к примеру
$aHtml = StringRegExp($sHtml, "(?si)<tr>(.*?)</tr>", 3)

Dim $aCels[UBound($aHtml)+1][5]
$aCels[0][0] = UBound($aHtml)-1

For $i = 0 To $aCels[0][0]
	$aCels[$i+1][0] = "tr: " & $i+1
	
	$aSplit = StringRegExp($aHtml[$i], "<td>(.*?)</td>", 3)
	
	For $j = 0 To UBound($aSplit)-1
		$aCels[$i+1][$j+1] = $aSplit[$j]
	Next
Next

_ArrayDisplay($aCels)
 
Автор
Vlasssov

Vlasssov

Осваивающий
Сообщения
428
Репутация
25
Хм... Это надо осознать... Проблема в том, что таблиц в Html может быть много.. Сначала надо найти нужную таблицу... буду думать.. :wall_brake:
 

r35p3ct

Продвинутый
Сообщения
226
Репутация
60
Помогете разобраться...
Код:
$a='			<td>Иванов Иван Иванович</td>'
StringRegExpReplace($a, '[<>td//]', '');Убирает теги

Как убрать пробелы?
UPD: Вопрос снят.
Код:
$sRet = StringRegExpReplace($a, '[<>td//(\t)]', '')
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8 175
Репутация
2 331
r35p3ct [?]
Не совсем верно, это уберёт в строке все символы по отдельности <, >, /, t, d. Вот так будет правильнее:

Код:
StringRegExpReplace($a, '<td>|</td>', '') ;Убирает теги


А если там будут пробелы а не табуляция? Лучше через StringStripWs($sStr, 1).
 
Автор
Vlasssov

Vlasssov

Осваивающий
Сообщения
428
Репутация
25
А нет ли вообще какой библиотеки, которая HTML обрабатывает как текстовый файл? Загружаешь по адресу Html и обрабатываешь...
 

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4 020
Репутация
622
Vlasssov сказал(а):
А нет ли вообще какой библиотеки, которая HTML обрабатывает как текстовый файл? Загружаешь по адресу Html и обрабатываешь...
Код:
$URL = 'http://www.somesite.somedomain'
$a = 'c:\somefolder\mydownloaded.html'
InetGet($URL, $a)
$hFile = FileOpen($a, 0)
;---------
Do something
;---------
FileClose($hFile)
 
Автор
Vlasssov

Vlasssov

Осваивающий
Сообщения
428
Репутация
25
Смешно... Ну и как с помощью вашего примере, не запуская IE, получить коллекцию картинок в данном файле? Самому прописать функцию поиска в текстовом файле тэгов <img>?
Речь и идет о том, чтобы не создавать объект IE, и при этом получить доступ к объектной модели, исключая разве что методы связанные с навигацией.. Как то:
1. Получить стили используемые в документах
1. Получить скрипты
3. Получить ссылки на картинки
4. Получить внешние ссылки
5. Получить коллекцию форм и их элементов..
 

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4 020
Репутация
622
Vlasssov
а что смешного? ;D неужели сам не чувствуешь разницу в своем первом вопросе, и втором?
если в первом ты спрашивал как обрабатывать html страницу как текстовый файл (слово как здесь лишнее, т.к. html-страницы и есть текстовый файл), без привлечения браузера, а во втором как вытаскивать оттуда всякие объекты.
кстати говоря, парсингом строк тоже можно очень много всяко-разного вытащить из страниц
 
Автор
Vlasssov

Vlasssov

Осваивающий
Сообщения
428
Репутация
25
Kaster сказал(а):
Vlasssov
а что смешного? ;D неужели сам не чувствуешь разницу в своем первом вопросе, и втором?
если в первом ты спрашивал как обрабатывать html страницу как текстовый файл (слово как здесь лишнее, т.к. html-страницы и есть текстовый файл), без привлечения браузера, а во втором как вытаскивать оттуда всякие объекты.
кстати говоря, парсингом строк тоже можно очень много всяко-разного вытащить из страниц
О Да!!! Текстовый файл Html содержит объектную модель, в предидущих сообщениях, я спрашивал, про объектную модель и уже приводились примеры получения массива содержащего текст в таблицах...
Парсингом - можно и базы данных обрабатывать... Помню в студенческие годы знавал я одного специалиста, который хвастался, что реализовал поиск в базе данных по фрагменту текста на ассемблере... :whistle:
Если, конечно, компоненты такой нет, то и сам напишешь.. Только - долго... Но если нужда заставит, еще не так раскорячишься :laugh:
 

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4 020
Репутация
622
а чем не нравится через
Код:
ObjCreate('InternetExplorer.Application')

или его урезанный вариант
Код:
ObjCreate('Shell.Explorer.2')
?
 
Автор
Vlasssov

Vlasssov

Осваивающий
Сообщения
428
Репутация
25
Тем, что создание объекта ie - кучу времени занимает, InetGet работает быстрее... Скачал файл - и развлекайся...
 

r35p3ct

Продвинутый
Сообщения
226
Репутация
60
Код:
$txt='			<td>ФИО</td><td>Иванов  Иван  Иванович</td>'
$txt=StringRegExpReplace($txt, '( ){2}', ' ')
$name=StringRegExpReplace($txt, '.*(\t)(<td>ФИО</td>)<td>|</td>', '')

Гуру StringRegExp, помогите вытащить ФИО из строки, мой кривой метод работает, но хочется одной строкой, если возможно...
 

Medic84

Омега
Команда форума
Администратор
Сообщения
1 541
Репутация
326
Обязательно в одну строку??? Если в одну, то это выходит немного по уродски :blink:

Код:
$txt='          <td>ФИО</td><td>Иванов  Иван  Иванович</td>'
$name=StringStripWs(StringReplace(StringRegExpReplace($txt, "<td>ФИО</td><td>(.*)</td>","\1"),"  "," "),1)
MsgBox(1,"", $name)
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8 175
Репутация
2 331
Medic84 [?]
Если в одну, то это выходит немного по уродск
Имелось в виду в одну строку с RegExp. Но поскольку условия возможного содержания первоначальной строки не указаны, у меня есть два варианта:

Вариант 1 - “Как есть”, любое мелкое изменение в исходной строке повлекёт неработоспособность выражения:

Код:
$txt = '          <td>ФИО</td><td>Иванов  Иван  Иванович</td>'
$name = StringRegExpReplace($txt, '(?i).*<td>(.*?)(?: )+(.*?)(?: )+(.*?)</td>', '\1 \2 \3')

ConsoleWrite($name & @CRLF)


Вариант 2 - Более предусмотрителен, но оставляет в полученной строке хвосты в виде лишних пробелов:

Код:
$txt = '          <td>ФИО</td><td>Иванов  Иван  Иванович</td>'
$name = StringRegExpReplace($txt, '(?i).*?<td>|(?:(?: )+?)|</td>', ' ')

ConsoleWrite($name & @CRLF)

Которые можно поправить со StringStripWS.
 

r35p3ct

Продвинутый
Сообщения
226
Репутация
60
Всем Салют!
Опять возникли вопросы по RegExp, помогите разобраться.
Код:
;$a='		<td>Адрес</td><td>фридриха энгельса ул. д. 41/42			
подъезд 3    этаж 6   квартира 16   			</td>'
;$a='			<td>Адрес</td><td>псковская ул. д. 5 к. 1			
подъезд 4    этаж 8   квартира 21  			</td>'
$a='			<td>Адрес</td><td>проходчиков ул. д. 1 к. 2			
подъезд 4    этаж 3   квартира 343  			</td>'
;$a='			<td>Адрес</td><td>страстной бул. д. 17 стр. 1			
подъезд 1    этаж 7   квартира 39   			</td>'
;$a='			<td>Адрес</td><td>тверская-ямская 1-я ул. д. 56/4 стр. 2			
подъезд 4    этаж 2   квартира 87   			</td>'

$UL=StringRegExpReplace($a,'.*(<td>|</td>)<td>(.*?)\hд.*' , '\2')
$DOM=StringLower(StringRegExpReplace($a,'.*д\.\s+(\d+\/?\d*\D?)\h+.*', '\1'))
$COR=StringRegExpReplace($a,'.*к\.\h(\d*).+' , '\1')
$STR=StringRegExpReplace($a,'.*стр\.\s+(\d+)\h+.*' , '\1')
if StringIsDigit($COR)=0 then $COR=''
if StringIsDigit($STR)=0 then $STR=''
ConsoleWrite($UL&@LF&$DOM&@LF&$COR&@LF&$STR&@LF)

Есть строка с адресом, нужно из нее вытащить данные, корпус, дом и т.д.
Мой код все это делает, но вот можно ли его упростить в смысле парсинга с помощью RegExp Строения и Корпуса т.к. эти данные не всегда есть в строке?
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8 175
Репутация
2 331
r35p3ct [?]
можно ли его упростить в смысле парсинга с помощью RegExp Строения и Корпуса т.к. эти данные не всегда есть в строке?
Код:
$sUl_Pattern = '</td><td>(.*)\hд\.'
$sDom_Pattern = '\s+(\d+(?:/\d+|))'
$sCor_Pattern = '\s+(?:к\.\s+(\d+)|)'
$sStr_Pattern = '(?:стр.\h(\d+)|)\s+'

$aData = StringRegExp($a, '.*' & $sUl_Pattern & $sDom_Pattern & $sCor_Pattern & $sStr_Pattern & '.*', 3)

For $i = 0 To UBound($aData)-1
	ConsoleWrite($aData[$i] & @CRLF)
Next
 

r35p3ct

Продвинутый
Сообщения
226
Репутация
60
Код:
$a='			<td>Телефон</td><td>дом.111-09-91, моб.906-221-11-11, моб.903-333-44-44</td>'
;$a='			<td>Телефон</td><td>дом.111-09-91, моб.906-222-11-11</td>'
;$a='			<td>Телефон</td><td>дом.111-09-91</td>'
$pattern='.*?(\d*-*\d+-\d+-\d+).+?(\d*-*\d+-?\d+-\d+-\d+).+?(\d*-\d+-\d+-\d+).+'
$TEL=StringRegExpReplace($a,$pattern , '\1,\2,\3')
ConsoleWrite($tel&@LF)

Помогите сделать правильный паттерн) Т.к если будет один телефон или 2, то уже не работает.
Понятно, что нужно 2ю и 3ю группы, через ? установить, но (\d*-\d+-\d+-\d+)? не работает, и тут возникает вопрос если записана строка
Код:
\d?-
в паттерне" ? " относится к \d или к дефису? Ну на рабочем примере я это наверно сам пойму)
Телефон соотв. может быть с кодом и без.

ЗЫ Вообще все это можно сделать так:
Код:
$pattern='[^0-9,-]'
$TEL=StringRegExpReplace($a,$pattern , '')
ConsoleWrite($tel&@LF)

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

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8 175
Репутация
2 331
r35p3ct [?]
Помогите сделать правильный паттерн) Т.к если будет один телефон или 2, то уже не работает.
Какой результат ожидается?
 

r35p3ct

Продвинутый
Сообщения
226
Репутация
60
:-[ упс.
В общем сами телефоны...
 
Верх