Что нового

Выборка данных из html таблицы

Шайтанчег

Новичок
Сообщения
15
Репутация
0
Доброго времени суток.
В браузерке есть таблица характеристик, из которых нужно выбрать числовые значения только для параметров: Уровень, Сила, Защита

Код:
<table class='skills h20 font_black'>
    <tr><th colspan='5' class='blockTitle'>Способности</th></tr>
    <tr	class='row_1'>
	    <td class='c1'><b class='icon ico_level' title='Уровень'></b>
	    <td class='c2 left'>Уровень
	    <td class='center'>7
	    <td>
    </tr>
	    <tr >
	    	<td><b class='icon ico_power' title='Сила'></b></td>
		    <td class='left'>Сила</td>
		    <td class='c3'><span class='stat_bar' style='width:150px'><b></b><i style='width:145px'></i></span></td>
		    <td class='c4'>24</td>
	    </tr>	    <tr class='row_1'>
	    	<td><b class='icon ico_block' title='Защита'></b></td>
		    <td class='left'>Защита</td>
		    <td class='c3'><span class='stat_bar' style='width:150px'><b></b><i style='width:138px'></i></span></td>
		    <td class='c4'>23</td>
	    </tr>	    <tr >
	    	<td><b class='icon ico_dexterity' title='Ловкость'></b></td>
		    <td class='left'>Ловкость</td>
		    <td class='c3'><span class='stat_bar' style='width:150px'><b></b><i style='width:145px'></i></span></td>
		    <td class='c4'>24</td>
	    </tr>	    <tr class='row_1'>
	    	<td><b class='icon ico_endurance' title='Масса'></b></td>
		    <td class='left'>Масса</td>
		    <td class='c3'><span class='stat_bar' style='width:150px'><b></b><i style='width:120px'></i></span></td>
		    <td class='c4'>20</td>
	    </tr>	    <tr >
	    	<td><b class='icon ico_charisma' title='Мастерство'></b></td>
		    <td class='left'>Мастерство</td>
		    <td class='c3'><span class='stat_bar' style='width:150px'><b></b><i style='width:132px'></i></span></td>
		    <td class='c4'>22</td>
	    </tr>

    <tr class='row_1'><td><b class='icon ico_glory' title='Слава'></b></td>
	    <td class='left'>Слава
	    <td class='center'>28
	    <td>
    </tr>
    </table>

Вот кое что нашел, только как из этого массива вытянуть нужные параметры для сравнения?

Код:
#include <IE.au3>
$oIE = _IECreate("http://")
$oTable = _IETableGetCollection ($oIE, 0)
$aTableData = _IETableWriteToArray ($oTable)
 

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
Шайтанчег [?]
как из этого массива вытянуть нужные параметры

Код:
#include <IE.au3>
$oIE = _IECreate("http://")
$oTable = _IETableGetCollection ($oIE, 0)
$aTableData = _IETableWriteToArray ($oTable, 1)

	ConsoleWrite($aTableData[0][0] & @CRLF)
	ConsoleWrite("============" & @CRLF)
	ConsoleWrite($aTableData[1][1] & " / " & $aTableData[1][2] & @CRLF)
	ConsoleWrite($aTableData[2][1] & " / " & $aTableData[2][3] & @CRLF)
	ConsoleWrite($aTableData[3][1] & " / " & $aTableData[3][3] & @CRLF)
	ConsoleWrite($aTableData[4][1] & " / " & $aTableData[4][3] & @CRLF)
	ConsoleWrite($aTableData[5][1] & " / " & $aTableData[5][3] & @CRLF)
	ConsoleWrite($aTableData[6][1] & " / " & $aTableData[6][3] & @CRLF)
	ConsoleWrite($aTableData[7][1] & " / " & $aTableData[7][2] & @CRLF)
 

Yuri

AutoIT Гуру
Сообщения
737
Репутация
282
Код:
#include <IE.au3>
#include <Array.au3> ;для возможности испольовать _ArrayDisplay

$oIE = _IECreate("C:\Documents and Settings\user11\Рабочий стол\Test.htm") ;скопированный из вопроса html код в файл на рабочем столе
$oTable = _IETableGetCollection ($oIE, 0)
$aTableData = _IETableWriteToArray ($oTable)

;первый способ глянуть что в массиве:
_ArrayDisplay( $aTableData, "Посмотрим что в массиве" )
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;второй способ глянуть что в массиве:
$iSize0 = UBound($aTableData, 0) ;узнать индекс размерности массива
$iSize1 = UBound($aTableData, 1) ;узнать 1-е кол-во размерности массива
$iSize2 = UBound($aTableData, 2) ;узнать 2-е кол-во размерности массива
MsgBox(64, "Размер массива", $iSize0&" ("&$iSize1&"/"&$iSize2&")")

If $iSize0 = 2 Then ;если массив двумерный, тогда
	ShowArray2()	;вызываем функцию ShowArray2
ElseIf $iSize0 = 1 Then ;если массив одномерный, тогда
	ShowArray1()
Else
	MsgBox(48, "Инфо", "Возможно массив пуст или др. размерности")
EndIf

Func ShowArray2() ;функция вывода значений двумерного массива
	For $i = 0 To $iSize2-1
		For $j = 0 To $iSize1-1
			If $aTableData[$j][$i] <> "" Then
				ConsoleWrite($aTableData[$j][$i]&" ")
			EndIf
		Next	
	   ConsoleWrite(@CRLF)	
	Next
EndFunc

Func ShowArray1() ;функция вывода значений одномерного массива
	For $i = 0 To $iSize1-1
		If $aTableData[$i] <> "" Then
			ConsoleWrite($aTableData[$i]&" ")
		EndIf
	Next
EndFunc
 
Автор
Ш

Шайтанчег

Новичок
Сообщения
15
Репутация
0
спасибо за ответы. да, в консоль выбрасывает характеристики, вопрос а как то можно из всех выбрать нужные числа (скажем уровень и силу)?
если написать код
Код:
$oTable = _IETableGetCollection ($oIE, 0)
$aTableData = _IETableWriteToArray ($oTable)
ConsoleWrite($aTableData[1][2])

то в консоле будет:
Способности
Уровень 9
Сила50
Защита66
Ловкость66
Масса51
Мастерство50
Слава 71
 

Yuri

AutoIT Гуру
Сообщения
737
Репутация
282
Код:
#include <IE.au3>
$oIE = _IECreate("C:\Documents and Settings\user_01\Рабочий стол\Test.htm") ;скопированный из вопроса html код в файл на рабочем столе
$oTable = _IETableGetCollection ($oIE, 0)
$aTableData = _IETableWriteToArray ($oTable)
$iSize1 = UBound($aTableData, 1)
$iSize2 = UBound($aTableData, 2)
$sText = ""
For $i = 0 To $iSize2-1
	For $j = 0 To $iSize1-1
		If $aTableData[$j][$i] <> "" Then			
			$sText &= StringStripWS($aTableData[$j][$i], 8)
		EndIf		
	Next
	$sText &="|"
Next
MsgBox(64, "Все данные", $sText)
$aVar1 = StringRegExp($sText, '\|Уровень(.*?)\|', 1)
$aVar2 = StringRegExp($sText, '\|Сила(.*?)\|', 1)
$aVar3 = StringRegExp($sText, '\|Слава(.*?)\|', 1)
MsgBox(64, "Уровень", $aVar1[0])
MsgBox(64, "Сила", $aVar2[0])
MsgBox(64, "Слава", $aVar3[0])
 
Автор
Ш

Шайтанчег

Новичок
Сообщения
15
Репутация
0
что то не выходит, тут я так понимаю осталось дело за регулярным шаблоном.
Код:
MsgBox(64, "Уровень", $aVar1[0])
этот кусочек не работает, но работает так
Код:
MsgBox(64, "Уровень", $aVar1)

при этом строка будет иметь вид: |СпособностиУровень8Сила19Защита23Ловкость19Масса18Мастерство19Слава33|
 

Yuri

AutoIT Гуру
Сообщения
737
Репутация
282
А это что выдает?
Код:
MsgBox(64, "Все данные", $sText)
 
Автор
Ш

Шайтанчег

Новичок
Сообщения
15
Репутация
0
ой, виноват,
Код:
MsgBox(64, "Все данные", $sText)
выдает |СпособностиУровень8Сила19Защита23Ловкость19Масса18Мастерство19Слава33|
а
Код:
MsgBox(64, "Уровень", $aVar1)

выдает 0
а
Код:
MsgBox(64, "Уровень", $aVar1[0])

выдает ошибку Subscript used with non-Array variable.:
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
Шайтанчег
А так:
Код:
#include <IE.au3>
;#include <Array.au3>

$sText = '|'
$oIE = _IECreate(@ScriptDir & '\test.htm')

$oTableAll = _IETableGetCollection($oIE)
$iNumTables = @extended
For $i = 0 To $iNumTables - 1
	$oTable = _IETableGetCollection($oIE, $i)
	$aTableData = _IETableWriteToArray($oTable)
	If StringInStr($aTableData[0][0], 'Способности') Then ExitLoop
Next
For $i = 0 To UBound($aTableData, 2) - 1
	For $j = 0 To UBound($aTableData) - 1
		If $aTableData[$j][$i] And $aTableData[$j][$i] <> '0' Then
			$sText &= StringStripWS($aTableData[$j][$i], 8) & '|'
		EndIf
	Next
Next
;_ArrayDisplay($aTableData)
;MsgBox(0, 'All Text', $sText)
$sVar1 = StringRegExpReplace($sText, '(?s).*?Уровень\|(\d+)\|?.*', '\1')
$sVar2 = StringRegExpReplace($sText, '(?s).*?Сила\|(\d+)\|?.*', '\1')
$sVar3 = StringRegExpReplace($sText, '(?s).*?Слава\|(\d+)\|?.*', '\1')
$sMessage = StringFormat('Уровень\t: %s\r\nСила\t: %s\r\nСлава\t: %s', $sVar1, $sVar2, $sVar3)
MsgBox(0, 'Info', $sMessage)
 
Автор
Ш

Шайтанчег

Новичок
Сообщения
15
Репутация
0
Пол дня вожусь с регулярными чето не получается, madmasles в вашем варианте 3 раза пишет все характеристики в ряд.
Притачил более полную страницу может там какаят особенность
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
Шайтанчег
Я поправил свой код. В файле test.htm код из Вашего 1.txt. У меня работает.
 
Автор
Ш

Шайтанчег

Новичок
Сообщения
15
Репутация
0
самое оно, всем большое спасибо )
а проблема была в регулярных? просто такую маску вроде пробовал
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
Шайтанчег [?]
а проблема была в регулярных?
Нет. Проблема была в индексе таблицы.
Можно попробовать напрямую с сайта получить эти данные, не открывая IE. У меня с файлом работает:
Код:
;#include <INet.au3>
#include <Array.au3>

;$sURL = 'Ваш сайт
;$sSource = _INetGetSource($sURL)
$sSource = FileRead(@ScriptDir & '\test.htm');если напрямую с сайта получать, то надо раскомментировать три строки и удалить эту.

If Not $sSource Then
	MsgBox(16, 'Error', 'Error')
	Exit
EndIf
$aTemp_1 = StringRegExp($sSource, "<td class=.*left'>([а-яА-Я]+)(?:<|\r\n)", 3)
$aTemp_2 = StringRegExp($sSource, "<td class=(?:'center'>|'c4'>)(\d+)(?:<|\r\n)", 3)
If Not IsArray($aTemp_1) Or Not IsArray($aTemp_2) Then
	MsgBox(16, 'Error', 'Error')
	Exit
EndIf
$iUb = UBound($aTemp_1)
If $iUb <> UBound($aTemp_2) Then
	MsgBox(16, 'Error', 'Error')
	Exit
EndIf
Dim $aResult[$iUb][2]
For $i = 0 To $iUb - 1
	$aResult[$i][0] = $aTemp_1[$i]
	$aResult[$i][1] = $aTemp_2[$i]
Next
_ArrayDisplay($aResult)
For $i = 0 To $iUb - 1
	MsgBox(64, $i, $aResult[$i][0] & @TAB & ':' & $aResult[$i][1])
Next
 

mrsoros

Новичок
Сообщения
24
Репутация
0
Здравствуйте. С регулярными выражениями туго у меня. Это целый отдельный язык.
Помогите пожалуйста получить массив вида {Версия;9.4;Команда;-n start;Ссылка;http://s.ucoz.net/} из:
<style type="text/css">.datatable
{
border-collapse:collapse;
}
.datatable tr td
{
vertical-align: top;
text-align: left;
border-style: groove;
}
.datatable_img
{
width:50%;
}
.datatable_img img{
width:100%;
heigh:100%;
}
.datatable_text
{

width:50%;
}
</style>
<table class="datatable">
<tbody>
<tr>
<td class="datatable_text">Версия</td>
<td class="datatable_text">9.4</td>
</tr>
<tr>
<td class="datatable_text">Команда</td>
<td class="datatable_text">-n start</td>
</tr>
<tr>
<td class="datatable_text">Ссылка</td>
<td class="datatable_text">http://s.ucoz.net/</td>
</tr>
</tbody>
</table>
 

InnI

AutoIT Гуру
Сообщения
4,950
Репутация
1,444
Код:
; $Text = ClipGet()
$Data = StringRegExp($Text, '"datatable_text">(.*?)</td>', 3)
If @error Then Exit
$Str = "{"
For $i = 0 To UBound($Data) - 1
  $Str &= $Data[$i] & ";"
Next
$Str = StringTrimRight($Str, 1) & "}"
; ConsoleWrite($Str & @CRLF)
 
A

Alofa

Гость
Код:
$sText = FileRead('File.html')
If @error Then Exit

$sText = StringRegExpReplace($sText, '(?s).+?td class="datatable_text">([^<]+)<', '\1;')
$sText = '{' & StringRegExpReplace($sText, '(?s)([^[]+)(\h\[.+?\]);.*', '\1} \2')

MsgBox(262144, Default, $sText) ; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<< П Р О В Е Р К А >>>>>>>>>>>>>>>>>>>>>>>>
 
Верх