Написать функцию определения скрытых ссылок

В этой теме можно использовать автоматический гарант!

paymer

floppy-диск
Пользователь
Регистрация
31.03.2011
Сообщения
3
Реакции
0
Задача - при парсинге определять какие ссылки являются нормальными а какие скрытыми.
Варианты с ссылкой под картинкой цвета фона тут не рассматриваем.

Пример страници с спрятанными ссылками
<html>
<head>
<style type="text/css">
<!--
#net1 {display:none}
#net2 {visibility:hidden}
#net3 {position: absolute; left: -200px }
#net4 {position: absolute; right: 2000px }
#net5 {position: absolute; top: -200px }
#net6 {position: absolute; bottom: 2000px }
-->
</style>
</head>
<body>
<div id="net1">
<a href="http://google.com/">hidden link 1</a>
</div>
<div id="net2">
<a href="http://google.com/">hidden link 2</a>
</div>
<div id="net3">
<a href="http://google.com/">hidden link 3</a>
</div>
<div id="net4">
<a href="http://google.com/">hidden link 4</a>
</div>
<div id="net5">
<a href="http://google.com/">hidden link5</a>
</div>
<div id="net6">
<a href="http://google.com/">hidden link6</a>
</div>

<center>
<a href="http://yahoo.com/">normal link</a>
</center>

</body>
</html>



работаем c C++ (Visual Studio 2005)
Делаем парсер, возникло желание как то отличать обычные видимые ссылки и спрятанные ссылки,
которые обычный пользователь не видит на экране (хидеными div, span свойствами обьекта)

Код который надо улучшить :
Код:
      CollapsedExpandedWrap enabledWrap disabled
       
           class CHtmlView : public CFormView
           {
           ...
               LPDISPATCH
       
      GetApplication() const;
               LPDISPATCH GetParentBrowser() const;
               LPDISPATCH GetContainer() const;
               LPDISPATCH GetHtmlDocument() const;
           ...
           }
       
       
       
      используем MSHTML.tlh
      CollapsedExpandedWrap enabledWrap disabled
       
           _COM_SMARTPTR_TYPEDEF(IHTMLDocument2, __uuidof(IHTMLDocument2));
           _COM_SMARTPTR_TYPEDEF(IHTMLElement, __uuidof(IHTMLElement));
       
       
       
      далее
       
      CollapsedExpandedWrap enabledWrap
       
           class BrowserExplorer : public CHtmlView
           {
           protected: // create from serialization only
               BrowserExplorer();
       
       
           ...
           }
       
       
      далее в
      CollapsedExpandedWrap enabledWrap disabled
       
           void BrowserExplorer::openurl(char *url){
               try{
                    MSHTML::IHTMLDocument2Ptr pDoc(GetHtmlDocument());
                    MSHTML::IHTMLElementPtr
       
       
      e(pDoc->Getall()->item(_T("")));
       
       
      получаем
       
      CollapsedExpandedWrap enabledWrap disabled
       
                    int g = pDoc->Getlinks()->Getlength();
                    for (int j = 0; j < g-1; j++){
                         BSTR b,v;
                         e = pDoc->Getlinks()->item(j);
                     }

задача ... в последнем цикле.. написать функцию()as boolean вызывая которую для каждой ссылки получаем
проверку всех parent тэгови на наличие свойств display:none, visibility:hidden , проверяем позицию тэгов.. на absolute; left: -200px top: -200px (отрицательные top и left и right превышающий 2000)
а также, проверять "class=" этих тэгов и "id=" и смотреть в таблице стилей не указаны ли параметры display:none, visibility:hidden у них и absolute; left: -200px top: -200px (отрицательные top и left и right превышающий 2000)
если при рекурсии "на верх" встречается что либо подобное, то return false и переходим к след ссылке
еще раз по пунктам:
в тэгах
display:none, visibility:hidden
left или top отрицателньые
right > 2000
то
return false
в таблицах стилей присутствуют id или class тэгов у которых
display:none, visibility:hidden
left или top отрицателньые
right > 2000
то
return false

иначе выходим из функции с True

а если не встрчаем то заносим индекс этой ссылки в массив "хороших" ссылок
в итоге у нас получается массив с индексами видимых ссылок. индекс от общего числа pDoc->Getlinks()
пример использования функции:
int g = pDoc->Getlinks()->Getlength();

пример использования функции:
Код:
cntStk=0;
              for (int j = 0; j < g-1; j++){
                    BSTR b,v;
                    e = pDoc->Getlinks()->item(j);
                    e->get_tagName(&b); // Get tag of element
                    e->get_outerHTML(&v); // Get text of element
                    if (visible(v)){
                          goodindexes[cntStk++] = j;
                    }

jabber temp77@jabber.ru
 
Вариантов скрытия много, самый рабочий вариант, это получить видимую область в image буффер, перебирать ссылки и менять у каждой visibility на hidden, и сверять результат на экране с исходным буффером.
Если состояние изменилось - линка была видимой, и стало невидимой, если же нет - линки на экране видно не было.
 


Напишите ответ...
Верх