Что нового

Содержимое между тегами (с пробелами и переходами на новую строку)

andr_mozg

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

должно получится что то вроде

Должность: Редактор-эксперт
Отдел: бла-бла-бла
Офис: Головной
Комната: 902
День рождения: 19 июля
Рабочий телефон: 111-22-33
Внутренний номер: 3441
E-mail: [email protected]
Стаж: 9 месяцев



Код:
<dl class="d-list">
        <dt>Должность: </dt>
        <dd>
            Редактор-эксперт</dd>
        <dt>Отдел: </dt>
        <dd>
            бла-бла-бла
            
            <a class="more-info" href="/Employees.aspx?Id=20164">посмотреть структуру</a>
            
        </dd>
        <dt>Офис: </dt>
        <dd>
            Головной
        </dd>
        <dt>Комната: </dt>
        <dd>
            902</dd>
        
        <dt>День рождения: </dt>
        <dd>
            19 июля</dd>
        
    </dl>
    <dl class="d-list">
        <dt>Рабочий телефон: </dt>
        <dd>
            111-22-33</dd>
        <dt>Внутренний номер: </dt>
        <dd>
            3441</dd>
        <dt>E-mail: </dt>
        <dd>
            <a href="mailto:[email protected]">
                [email protected]</a></dd>
        <dt>Стаж: </dt>
           
           <dd>    9
               месяцев
               
           </dd>
        <dd>
            
            </></dd>
        
    </dl>
    
    <script type="text/javascript">
	function saveDescription() { 
		body_BodyHolder_EmployeeCard_txtDescription.save();
	}
    </script>
    <div id="body_BodyHolder_EmployeeCard_panelMultiView">
 

Arei

Скриптер
Сообщения
938
Репутация
115
желательно сайт дать, т.к не очень понятно по коду, лучше уж в стандартных условиях проверять.
 
Автор
A

andr_mozg

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

axlwor

Скриптер
Сообщения
657
Репутация
147
Код страницы сохранил в файл txt.txt каталоге скрипта вручную

Код:
#include <array.au3>
$file = FileOpen("txt.txt", 0)
$sHTML = FileRead($file)
FileClose($file)
$sPattern = '(?sim)<dt>(.*?)</dt>.*?<dd>(.*?)</dd>'
$aA = StringRegExp($sHTML, $sPattern, 3)
_ArrayDisplay($aA)
Dim $aB[UBound($aA)/2][2]
For $i = 0 To UBound($aA) - 1 Step 2
	$aB[$i/2][0] = StringStripWS( $aA[$i]  , 7)
	$aB[$i/2][1] = StringStripWS( $aA[$i+1], 7)
	If $aB[$i/2][0] = 'E-mail:' Then
		$sPattern = '[A-Za-z0-9._-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,4}'
		$aC = StringRegExp($aB[$i/2][1], $sPattern, 3)
		If @error = 0 Then
			$aB[$i/2][1] = $aC[0]
		EndIf
	EndIf
Next
_ArrayDisplay($aB)
 
Автор
A

andr_mozg

Новичок
Сообщения
15
Репутация
0
все работает :laugh:
в идеале в 8 строке массива там где стаж, надо поменять переход на новую строку @CR на пробелы.
а в 1 столбце где отдел:
[1]|Отдел:|бла-бла-бла
<a class="more-info" href="/Employees.aspx?Id=2323">посмотреть структуру</a>




Добавлено:
Сообщение автоматически объединено:


If $aB[$i/2][0] = 'Отдел:' Then
$sPattern = '(.*?)<a class='
$aC = StringRegExp($aB[$i/2][1], $sPattern, 3)
If @error = 0 Then
$aB[$i/2][1] = $aC[0]
EndIf
EndIf
но вконце остается знак перехода на новую строку
 

axlwor

Скриптер
Сообщения
657
Репутация
147
1.
Код:
$aB[$i/2][0] = StringStripWS( StringReplace( $aA[$i]  , @CR, " "), 7)
	$aB[$i/2][1] = StringStripWS( StringReplace( $aA[$i+1], @CR, " "), 7)


а про отдел не понял что ты хочешь
 
Автор
A

andr_mozg

Новичок
Сообщения
15
Репутация
0
касаемо отдела...
значение имеет вид
Отдел:|бла-бла-бла
<a class="more-info" href="/Employees.aspx?Id=2323">посмотреть структур

где бла-бла-бла - это отдел а дальше переход на новую строку и <a class="more-info.... то что нужно отрезать
 

axlwor

Скриптер
Сообщения
657
Репутация
147
Код:
#include <array.au3>
$file = FileOpen("txt.txt", 0)
$sHTML = FileRead($file)
FileClose($file)
;~ $sPattern = '(?sim)<dt>(.*?)</dt>.*?<dd>(.*?)</dd>'
$sPattern = '(?sim)<dt>\s*(.*?)\s*</dt>.*?<dd>\s*(.*?)\s*</dd>'
$aA = StringRegExp($sHTML, $sPattern, 3)
;~ _ArrayDisplay($aA)
Dim $aB[UBound($aA)/2][2]
For $i = 0 To UBound($aA) - 1 Step 2
	$aB[$i/2][0] = StringStripWS( StringReplace( $aA[$i]  , @CR, " "), 7)
	$aB[$i/2][1] = StringStripWS( StringReplace( $aA[$i+1], @CR, " "), 7)
	If $aB[$i/2][0] = 'E-mail:' Then
		$sPattern = '[A-Za-z0-9._-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,4}'
		$aC = StringRegExp($aB[$i/2][1], $sPattern, 3)
		If @error = 0 Then
			$aB[$i/2][1] = $aC[0]
		EndIf
		ContinueLoop
	EndIf
	$iPos = StringInStr($aB[$i/2][1], ' <a')
	If $iPos > 0 Then
		$aB[$i/2][1] = StringLeft($aB[$i/2][1], $iPos - 1)
	EndIf
Next
_ArrayDisplay($aB)
 

gregaz

AutoIT Гуру
Сообщения
1,166
Репутация
299
А если так ? :
Код:
#include<Array.au3>
$sText=FileRead(@ScriptDir & "\Test.txt")

$sText=StringRegExpReplace($sText,"(?msi)(</dt>.*?<dd>\s*|\s*<a.+?>\s*|\s*</dd>|</a>|(?<=\d)\s*)","")

$aRet=StringRegExp($sText,"<dt>(.+)\r\n",3)

_ArrayDisplay($aRet)



Добавлено:
Сообщение автоматически объединено:

Или в таком виде , что еще проще :
Код:
#include<Array.au3>
$sText=FileRead(@ScriptDir & "\Test.txt")

$sText=StringRegExpReplace($sText,"\s*(?=\s)","")

$aRet=StringRegExp ( $sText ,'(?:<dt>|<dd>\s*(?:<a.*?>)?)\s*(.*?)\s*<',3 )

_ArrayDisplay($aRet)
 

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
gregaz
Я пытался обойтись только одним действием, StringRegExpReplace, но, я в этом не силён ;D
Вот мне интересно, можно обойтись одним StringRegExpReplace, как думаете?
Хотя, ваш вариант мне уже нравится.
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Garrett [?]
Вот мне интересно, можно обойтись одним StringRegExpReplace, как думаете?
Одним StringRegExp наверное имелось в виду:

Код:
$aRet = StringRegExp($sText, '(?:<dt>|<dd>\s*(?:<.*?>)?)\s*((?s)[^<]*)\s*</', 3)
 

gregaz

AutoIT Гуру
Сообщения
1,166
Репутация
299
Garrett [?]
Вот мне интересно, можно обойтись одним StringRegExp, как думаете?
Вариант Creatora не совсем корректен в отношении последней строки

Я получал этот вариант (Интересно,что "один в один"),
но он не совсем корректен в отношении строки СТАЖ:

Именно из-за этой строки и пришлось применить предварительный StringRegExpReplace

Наверное можно ухитриться выполнение в "один присест", но мне не удалась последняя строка
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
gregaz [?]
не совсем корректен в отношении строки СТАЖ:
А что тут некорректного, мы получаем содержимое тегов, то что там перевод строки это уже маловажно, главное что оно в одну ячейку попадает.

Если без массива, то примерно так, но как видно всё обработать не удалось.

Код:
$sRet = StringRegExpReplace($sText, '(?s).*?<dt>(.*?)</dt>\s*<dd>\s*(.*?)(?:\s*<a[^@]*?>.*?</a>)?\s*</dd>.*?|\s*<.*', '\1 \2' & @CRLF)
ConsoleWrite($sRet & @LF)


Строку с email нужно очищать по условию, что довольно непросто реализовать, хотя и возможно (судя по документаций).
 

gregaz

AutoIT Гуру
Сообщения
1,166
Репутация
299
CreatoR [?]
перевод строки это уже маловажно, главное что оно в одну ячейку попадает.

Ну так потом придется очищать эти строки : (еще и "Головной"), а это уже не совсем в один присест.
Да и " 9 месяцев" : это не совсем корректно.
В принципе нужен ответ на вроде простую локальную задачу :
Как получить из :
Код:
<dt>Стаж: </dt>
           
           <dd>    9
               месяцев
               
           </dd>
массив :
Код:
Стаж:
9 месяцев
 

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
CreatoR [?]
Одним StringRegExp наверное имелось в виду:
Нет именно StringRegExpReplace. То есть берём "грязный" текст, а на выходе получаем "$1 - $2"
Я пробовал всё это дело сделать следующим образом, брал "грязный" текст удалял все повторяющиеся пробелы, а потом находил нужные значения и делал замену.
Код:
$sText = StringStripWS($sText, 4)
$sText = StringRegExpReplace($sText, 'pattern', '$1 - $2' & @CRLF)

Но, к сожалению, качественный шаблон у меня так и не получилось сделать :(
Загвоздка была в том, чтобы за один раз вырезать нужный текст и удалить в нём ссылки.
Ох уж эти RegExp`ы, мышление нужно разворачивать на 180 градусов. :laugh:
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
gregaz [?]
Ну так потом придется очищать эти строки
Ну в любом случае с этими строками ведь нужно что-то делать, значит во время этих самых поделок и будет очищаться текст.

В принципе нужен ответ на вроде простую локальную задачу :
Как получить из :
массив
Никак, мы не можем разделать захыватывающую группу (т.е помещать всё в под одну группу, а проверять по отдельности, другими словами, нельзя склеивать группу на момент выполнения).

Garrett [?]
Ох уж эти RegExp`ы, мышление нужно разворачивать на 180 градусов.
“Повезло” в этом плане людям, страдающим(?) синдромом Аспергера.
 
Верх