Что нового

Почему не срабатывает "иначе" в условной подмаске?

vovsla

Осваивающий
Сообщения
607
Репутация
36
Хотел получить цену со скидкой, если есть скидка, если нет скидки, то полную цену.
Цену со скидкой получить могу, а без скидки не получается т.к. не срабатывает "иначе".
На всякий случай на "иначе" установил выражение на получение всего текста, но и это не помогает
В чем может быть проблема?

Код:
#include <Array.au3>

$Mask = 'id="Price">(?(?=(?s).*?discount(?s).*?)(?s).*?class="add\-discount\-text\-price">(.*?)\D(?s).*?|((?s).*?))id="price\-tmpl">'

$URL = 'https://www.wildberries.ru/catalog/6474480/detail.aspx'
$URLData = GetURLData($URL)
$Result = StringRegExp($URLData, $Mask, 1)
_ArrayDisplay($Result)

$URL = 'https://www.wildberries.ru/catalog/4736240/detail.aspx?targetUrl=GP'
$URLData = GetURLData($URL)
$Result = StringRegExp($URLData, $Mask, 1)
_ArrayDisplay($Result)

Func GetURLData($URL)
	Local $URLData, $URLDataString

	$URLData=InetRead($URL)
	If @error Then Return SetError(1, 0, 0)
	$URLDataString=BinaryToString($URLData)
	If @error Then Return SetError(2, 0, 0)
	Return $URLDataString
EndFunc
 

sngr

AutoIT Гуру
Сообщения
1,010
Репутация
408
Нетуда смотришь
Код:
(?s).*?"price" content="([^"]+).*
 
Автор
V

vovsla

Осваивающий
Сообщения
607
Репутация
36
Я раньше оттуда и брал цену, но это не подходит т.к. цена на товар остается даже если товара нет в наличии.
Мне нужно получать цену только если есть товар

Код:
#include <Array.au3>

;~ $Mask = 'id="Price">(?(?=(?s).*?discount(?s).*?)(?s).*?class="add\-discount\-text\-price">(.*?)\D(?s).*?|((?s).*?))id="price\-tmpl">'
$Mask = '(?s).*?"price" content="([^"]+).*'


$URL = 'https://www.wildberries.ru/catalog/6474480/detail.aspx'
$URLData = GetURLData($URL)
$Result = StringRegExp($URLData, $Mask, 1)
_ArrayDisplay($Result)

$URL = 'https://www.wildberries.ru/catalog/4736240/detail.aspx?targetUrl=GP'
$URLData = GetURLData($URL)
$Result = StringRegExp($URLData, $Mask, 1)
_ArrayDisplay($Result)

$URL = 'https://www.wildberries.ru/catalog/5460135/detail.aspx'
$URLData = GetURLData($URL)
$Result = StringRegExp($URLData, $Mask, 1)
_ArrayDisplay($Result)



Func GetURLData($URL)
	Local $URLData, $URLDataString

	$URLData=InetRead($URL)
	If @error Then Return SetError(1, 0, 0)
	$URLDataString=BinaryToString($URLData)
	If @error Then Return SetError(2, 0, 0)
	Return $URLDataString
EndFunc
 

sngr

AutoIT Гуру
Сообщения
1,010
Репутация
408
Код:
(?m)(?(?="add-discount-text-price">\d+)"add-discount-text-price">|id="Price">[^/]+^)(\d+)
 
Автор
V

vovsla

Осваивающий
Сообщения
607
Репутация
36
Большое спасибо. Теперь понятно почему не работало условие.
Столкнулся с еще одной проблемой, если цена от 1000, то она указывается с пробелом после тысяч.
Для обозначения пробела используется ряд символов - &#xA0;
Цена 1058 указана как <span class="add-discount-text-price">1&#xA0;085&#xA0;СЂСѓР±.</span>

Я немного изменил маску чтобы выкинуть вышеуказанный ряд символов
Но такая маска возвращает два значения. Можно сделать маску которая будет возвращать одно значение?
Код:
#include <Array.au3>

$Mask = '(?m)(?(?="add-discount-text-price">\d+)"add-discount-text-price">|id="Price">[^/]+^)(\d+)(?:&#xA0;)?(\d+)'


$URL = 'https://www.wildberries.ru/catalog/6474480/detail.aspx'
$URLData = GetURLData($URL)
$Result = StringRegExp($URLData, $Mask, 1)
_ArrayDisplay($Result, '1')

$URL = 'https://www.wildberries.ru/catalog/4736240/detail.aspx?targetUrl=GP'
$URLData = GetURLData($URL)
$Result = StringRegExp($URLData, $Mask, 1)
_ArrayDisplay($Result, '2')

$URL = 'https://www.wildberries.ru/catalog/5460135/detail.aspx'
$URLData = GetURLData($URL)
$Result = StringRegExp($URLData, $Mask, 1)
_ArrayDisplay($Result, '3')

$URL = 'https://www.wildberries.ru/catalog/6101204/detail.aspx'
$URLData = GetURLData($URL)
$Result = StringRegExp($URLData, $Mask, 1)
_ArrayDisplay($Result, '4')



Func GetURLData($URL)
	Local $URLData, $URLDataString

	$URLData=InetRead($URL)
	If @error Then Return SetError(1, 0, 0)
	$URLDataString=BinaryToString($URLData)
	If @error Then Return SetError(2, 0, 0)
	Return $URLDataString
EndFunc
 

sngr

AutoIT Гуру
Сообщения
1,010
Репутация
408
Код:
$Mask = '(?m)(?(?="add-discount-text-price">\d+)"add-discount-text-price">|id="Price">[^/]+^)(\d+)'
$URLData=StringReplace($URLData,' ','')
 
Верх