rework crawler; add atom link extraction
[phinde.git] / src / phinde / LinkExtractor / Html.php
1 <?php
2 namespace phinde\LinkExtractor;
3
4 use phinde\LinkInfo;
5
6 class Html
7 {
8     public function extract(\HTTP_Request2_Response $res)
9     {
10         $url = $res->getEffectiveUrl();
11
12         $linkInfos = array();
13
14         //FIXME: mime type switch for cdata
15         $doc = new \DOMDocument();
16         //@ to hide parse warning messages in invalid html
17         @$doc->loadHTML($res->getBody());
18
19         //FIXME: extract base url from html
20         $base = new \Net_URL2($url);
21
22         $xpath = new \DOMXPath($doc);
23         $links = $xpath->evaluate('//a');
24         //FIXME: link rel, img, video
25
26         $alreadySeen = array();
27
28         foreach ($links as $link) {
29             $linkTitle = $link->textContent;
30             $href = '';
31             foreach ($link->attributes as $attribute) {
32                 if ($attribute->name == 'href') {
33                     $href = $attribute->textContent;
34                 }
35             }
36             if ($href == '' || $href{0} == '#') {
37                 //link on this page
38                 continue;
39             }
40
41             $linkUrlObj = $base->resolve($href);
42             $linkUrlObj->setFragment(false);
43             $linkUrl    = (string) $linkUrlObj;
44             if (isset($alreadySeen[$linkUrl])) {
45                 continue;
46             }
47
48             switch ($linkUrlObj->getScheme()) {
49             case 'http':
50             case 'https':
51                 break;
52             default:
53                 continue 2;
54             }
55
56             //FIXME: check target type
57             //FIXME: check nofollow
58             $linkInfos[] = new LinkInfo(
59                $linkUrl, $linkTitle, $url
60             );
61             $alreadySeen[$linkUrl] = true;
62         }
63
64         return $linkInfos;
65     }
66 }
67 ?>