Задача - при парсинге определять какие ссылки являются нормальными а какие скрытыми.
Варианты с ссылкой под картинкой цвета фона тут не рассматриваем.
Пример страници с спрятанными ссылками
<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 свойствами обьекта)
Код который надо улучшить :
задача ... в последнем цикле.. написать функцию()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();
пример использования функции:
jabber temp77@jabber.ru
Варианты с ссылкой под картинкой цвета фона тут не рассматриваем.
Пример страници с спрятанными ссылками
<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