Что нового

[RegExp] Регулярное выражение для парсинга html-содерджимого

Waik

Знающий
Сообщения
60
Репутация
16
По наставлением Creator создал тему.
Здравствуйте,

Нужна регулярка.Есть html код:

Код:
  <tr>
                        <td style="width: 16px;"><img src="http://www.сайт.net/images/icons/sword.png" alt="Kills" width="16" height="16" /></td>
						<td>Kills:</td>
						<td><strong>40</strong></td>
                        <td>(3.33)</td>
Нужно получить числа 40 и (3.33).

ps.В самой страничке много подобного кода только отличаються числа и вместо kills написаны друге значения.
 

axlwor

Скриптер
Сообщения
657
Репутация
147
может проще будет взять
Код:
_IETableWriteToArray
 
Автор
W

Waik

Знающий
Сообщения
60
Репутация
16
Зачем мне IE.Я попросил регулярку.
Код я получаю _INetGetSource и сохраняю в переменную.
 

axlwor

Скриптер
Сообщения
657
Репутация
147
похоже ты хочешь собрать из статистики перса все данные. Это простая таблица, осложненная форматированием. ИЕ само найдет таблицу и разберет ее до массива. В противном случае тебе придется переписывать движок :wacko:
Приведи полную таблицу со всеми статами. Может можно будет несколько раз натравливать stringRegexpReplace

Код:
#include <array.au3>

$str = '  <tr>'
$str &= '                       <td style="width: 16px;"><img src="http://www.сайт.net/images/icons/sword.png" alt="Kills" width="16" height="16" /></td>'
$str &= '                  <td>Kills:</td>'
$str &= '                  <td><strong>40</strong></td>'
$str &= '                        <td>(3.33)</td>'

$pattern = '<(?i)td>.*?([\d+\.]).*?</(?i)td>'
$A = StringRegExp ($str, $pattern,3)
_ArrayDisplay ($A)


шаблон поменял, а то он float не брал
 
Автор
W

Waik

Знающий
Сообщения
60
Репутация
16
axlwor
Твой код работает.Но если я пытаюсь использовать твою регулярку в полном исходном коде то она мне выдает вообще посторонние значения .
 

axlwor

Скриптер
Сообщения
657
Репутация
147
так и должно быть. Я же не видел всего остального. Выкладывай полный текст. Там могут быть и другие значения. _IETableWriteToArray выдал бы тебе всегда одну и ту же таблицу по которой ты получал бы нужные значения в точно известных ячейках. хотя я могу и ошибаться
Код:
#include <ie.au3>
#include <array.au3>
$oIE = _IECreate('http://твойсайт.net/и_дальше',0,0,1)
$oTable = _IETableGetCollection ($oIE, 1)
$A = _IETableWriteToArray($oTable)
_arraydisplay($A)
_IEQuit ($oIE)
 
Автор
W

Waik

Знающий
Сообщения
60
Репутация
16
эмм....
Ну предположим мне нужно получить все значения "Normal statistics" ,это kill,Death и.т.д
Вот ссылка рандомного юзера:
Код:
http://www.lolbase.net/us/Terravolt
Как посмотреть исходник знают все.
 

axlwor

Скриптер
Сообщения
657
Репутация
147
Код:
#include <array.au3>
#include <ie.au3>
$oIE = _IECreate("http://www.lolbase.net/us/Terravolt", 0,0,1)
$oTable = _IEGetObjById ($oIE, "globalstats-normal")
$A = _IETableWriteToArray($oTable, true)
_arraydisplay($A)
_IEQuit ($oIE)
 
Автор
W

Waik

Знающий
Сообщения
60
Репутация
16
axlwor
Большое спасибо,на будущее учту твой вариант.Красиво и удобно.Но мне нужно это дело решить при помощи StringRegExp.
 

axlwor

Скриптер
Сообщения
657
Репутация
147
:laugh: И все равно у меня _INetGetSource не грузит страницу
Код:
#include <array.au3>
#include <ie.au3>
#include <INet.au3>

$oIE = _IECreate("http://www.lolbase.net/us/Terravolt", 0,0,1)
;~ $str = _INetGetSource ('http://www.lolbase.net/us/Terravolt')
$str = _IEPropertyGet ($oIE, "outerHTML")
If $str = "" Then
	MsgBox(0,0,"Статы не загрузились")
	Exit
EndIf
$pattern = '<TD>(.+?):</TD>\s*<TD><STRONG>(.+?)</STRONG></TD>\s*<TD>([\(\)\d\.]*)</TD>'
$A = StringRegExp ($str, $pattern,3)
_ArrayDisplay ($A)
_IEQuit ($oIE)
 
Автор
W

Waik

Знающий
Сообщения
60
Репутация
16
Вот так я получаю страничку.Работает.
Код:
#include "INET.au3"
$url = "http://www.lolbase.net/us/terravolt"
$sReadFile = _INetGetSource($url)
Если применяю. вашу регулярку '
Код:
<TD>(.+?):</TD>\s*<TD><STRONG>(.+?)</STRONG></TD>\s*<TD>([\(\)\d\.]*)</TD>'
то нечего не получаю.

Мне нужны все значения "Нормал статистики " при помощи stringregexp с учетом того что я получаю исходник так как я показал выше.

P/s а у вас хоть INET.au3 есть? -))
 

axlwor

Скриптер
Сообщения
657
Репутация
147
у меня мой последний код работает. Получаю массив
[0]|Kills
[1]|40
[2]|(3.33)
[3]|Deaths
[4]|32
[5]|(2.67)
[6]|Assists
[7]|115
[8]|(9.58)
[9]|Gold
[10]|89087
[11]|(7423.92)
[12]|Minions slain
[13]|673
[14]|(56.08)
[15]|Largest critical strike
[16]|363
[17]|
[18]|Barracks destroyed
[19]|5
[20]|(0.42)
[21]|Largest killing spree
[22]|8
[23]|
[24]|Turrets destroyed
[25]|8
[26]|(0.67)
[27]|Largest multi kill
[28]|2
[29]|
[30]|Neutral monsters slain
[31]|108
[32]|(9.00)
[33]|Health restored
[34]|206083
[35]|(17173.58)
[36]|Damage dealt
[37]|613710
[38]|(51142.50)
[39]|Damage taken
[40]|244631
[41]|(20385.92)
[42]|Physical damage dealt
[43]|249760
[44]|(20813.33)
[45]|Physical damage taken
[46]|130986
[47]|(10915.50)
[48]|Magic damage dealt
[49]|363950
[50]|(30329.17)
[51]|Magic damage taken
[52]|100478
[53]|(8373.17)
а код
Код:
#include "INET.au3"
$url = "http://www.lolbase.net/us/terravolt"
$sReadFile = _INetGetSource($url)
msgbox(0,0,$sReadFile)

выдает пустую строку :rofl: персональный фаер стоял на запрете :-[
 
Автор
W

Waik

Знающий
Сообщения
60
Репутация
16
Ваш код работает,я согласен.
Я объясняю что ваша регулярка с моим способом получения исходонго не пашет.

эхх.... ладно приведу пример.Вот как я получаю имя игрока.
Код:
#include "INET.au3"
$url = "http://www.lolbase.net/us/terravolt"
$sReadFile = _INetGetSource($url)
msgbox(0,"Info",StringRegExpReplace($sReadFile, '(?s)(.*summoner-name">)(.*?)(<.*)', '\2'))
Дак мне нужен такой-же способ только что-бы получить значения "Нормал статистики."
 

axlwor

Скриптер
Сообщения
657
Репутация
147
Код:
#include "INET.au3"
$url = "http://www.lolbase.net/us/terravolt"
$sReadFile = _INetGetSource($url)
If $sReadFile = "" Then
    MsgBox(0,0,"Статы не загрузились")
    Exit
EndIf
$pattern = '<(?i)TD>(.+?):</(?i)TD>\s*<(?i)TD><(?i)STRONG>(.+?)</(?i)STRONG></(?i)TD>\s*<(?i)TD>([\(\)\d\.]*)</(?i)TD>'
$A = StringRegExp ($sReadFile, $pattern,3)
_ArrayDisplay ($A)
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8 470
Репутация
2 401
Так наверное будет удобнее:

Код:
#include <Array.au3>

$sUrl = "http://www.lolbase.net/us/terravolt"
$sRead = BinaryToString(InetRead($sUrl))

If $sRead = "" Then
    MsgBox(0, 0, "Статы не загрузились")
    Exit
EndIf

$sPattern1 = '<(?i)TD>(.+?):</(?i)TD>\s*<(?i)TD><(?i)STRONG>(.+?)</(?i)STRONG></(?i)TD>\s*<(?i)TD>([\(\)\d\.]*)</(?i)TD>'
$sPattern2 = 'Win/loss ratio:</td>\s+<td.+?>(.+?)</td>\s+<td.+?><img src=".+?" alt="Kill-Death Ratio".+?/> Kill/death ratio:</td>\s+<td.+?>(.+?)</td>\s+<td.+?>Matches: <b>(.+?)</b></td>'

$aStats1 = StringRegExp($sRead, $sPattern1, 3)
$aStats2 = StringRegExp($sRead, $sPattern2, 3)

Dim $iUbound = UBound($aStats1)-1, $iC = 4
Dim $aNormStats[Ceiling($iUbound/3)+$iC][4] = [[""], ["Win/loss ratio", $aStats2[0]], ["Kill/death ratio", $aStats2[1]], ["Matches", $aStats2[2]]]

For $i = 0 To $iUbound
	If $i + 2 < $iUbound Then
		$iC += 1
		
		$aNormStats[$iC][0] = $aStats1[$i]
		$aNormStats[$iC][1] = $aStats1[$i+1]
		$aNormStats[$iC][2] = $aStats1[$i+2]
		
		$i += 2
	EndIf
Next

_ArrayDisplay($aNormStats)
 
Автор
W

Waik

Знающий
Сообщения
60
Репутация
16
Большое большое спасибо CreatoR,axlwor за вашу помощь!!
РЕШЕНО!
 
Автор
W

Waik

Знающий
Сообщения
60
Репутация
16
Извиняюсь но заметил только сейчас.

В примере Creator*a код не показывает следующие значения :

Assists:
Time played:
Time spent dead:
Magic damage taken:
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8 470
Репутация
2 401
Waik [?]
В примере Creator*a код не показывает следующие значения
Ну, я всего лишь привёл в порядок код от axlwor, регулярка то не моя :smile:

Код:
#include <Array.au3>

$sUrl = "http://www.lolbase.net/us/terravolt"
$sRead = BinaryToString(InetRead($sUrl))

If $sRead = "" Then
    MsgBox(0, 0, "Статы не загрузились")
    Exit
EndIf

$sPattern1 = '(?i)<td>(.+?):</td>\s*<td>(?:<strong>)?(.+?)(?:</strong>)?</td>\s*<td>(\(.+?\)|)</td>'
$sPattern2 = 'Win/loss ratio:</td>\s+<td.+?>(.+?)</td>\s+.+?Kill/death ratio:</td>\s+<td.+?>(.+?)</td>\s+<td.+?>Matches: <b>(.+?)</b></td>'

$aStats1 = StringRegExp($sRead, $sPattern1, 3)
$aStats2 = StringRegExp($sRead, $sPattern2, 3)

Dim $iUbound = UBound($aStats1)-1, $iC = 4
Dim $aNormStats[Ceiling($iUbound/3)+$iC+1][4] = [[""], ["Win/loss ratio", $aStats2[0]], ["Kill/death ratio", $aStats2[1]], ["Matches", $aStats2[2]]]

For $i = 0 To $iUbound
    If $i + 1 < $iUbound Then
        $iC += 1
        
        $aNormStats[$iC][0] = $aStats1[$i]
        $aNormStats[$iC][1] = $aStats1[$i+1]
        $aNormStats[$iC][2] = $aStats1[$i+2]
        
        $i += 2
    EndIf
Next

_ArrayDisplay($aNormStats)
 
Автор
W

Waik

Знающий
Сообщения
60
Репутация
16
Спасибо,все отлично.
 

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4 020
Репутация
622
OffTopic:
Мне одному кажется, что тема названа не по правилам? :smile:
 
Верх