2015-01-30 4 views
1

현재 HTML을 JSON으로 변환 할 수 있습니다. 함수 element_to_obj으로 html을 파싱하고 html 내용으로 json 객체를 가져올 수 있습니다. 주요 관심사 : json 객체에서 href 태그의 값만 반환하고 다른 모든 태그는 무시할 수 있습니까?JSON에 HTML - href 속성 태그 만 추출

function html_to_obj($html) { 
    $dom = new DOMDocument(); 
    $dom->loadHTML($html); 
    return element_to_obj($dom->documentElement); 
} 

function element_to_obj($element) { 
    $obj = array("tag" => $element->tagName); 
    foreach ($element->attributes as $attribute) { 
     $obj[$attribute->name] = $attribute->value; 
    } 
    foreach ($element->childNodes as $subElement) { 
     if ($subElement->nodeType == XML_TEXT_NODE) { 
      $obj["html"] = $subElement->wholeText; 
     } 
     else { 
      $obj["children"][] = element_to_obj($subElement); 
     } 
    } 
    return $obj; 
} 

$html = <<<EOF 
<!DOCTYPE html> 
<html lang="en"> 
    <head> 
     <title> This is a test </title> 
    </head> 
    <body> 
     <h1> Go to a site? </h1> 
     <ul> 
      <li> <a href="http://example.com">Some Site</a> </li> 
      <li> <a href="http://example.com">Some Site</a> </li> 
     </ul> 
     <h1> Other sites to visit: </h1> 
     <div><a href="http://example.com">Some Site</a></div> 
     <div><a href="http://example.com">Some Site</a></div> 
     <div><a href="http://example.com">Some Site</a></div> 
     <div><a href="http://example.com">Some Site</a></div> 
    </body> 
</html> 
EOF; 

header("Content-Type: text/plain"); 
echo json_encode(html_to_obj($html), JSON_PRETTY_PRINT); 
+0

'if' 문을 사용하여 속성 이름을 확인하고'href '가 아닌 경우 건너 뜁니다. – Barmar

+0

그렇다면 그녀는 아무런 관심이없는 다른 모든 노드를 검사하게 될 것이며 일부 페이지는 꽤 클 수 있습니다. 따라서이 불필요한 것들을 모두 처리하는 데 오랜 시간이 걸릴 것입니다. 이 경우 getElementsByTagName을 사용하면 트릭을 수행해야합니다. 나는 또한 체크 아웃'python 치료'에 제안 할 수있다 – gxela

답변

0

getElementsByTagName을 사용하고 모든 요소를 ​​반복 할 수 있습니다.

<?php 

function html_to_obj($html, $tag = 'a') { 
    $dom = new DOMDocument(); 
    $dom->loadHTML($html); 
    return element_to_obj($dom->getElementsByTagName($tag)); 
} 

function element_to_obj($elements) { 
    $obj = array(); 
    foreach($elements as $index => $element){ 

     $obj[$index] = array("tag" => $element->tagName); 
     foreach ($element->attributes as $attribute) { 
      $obj[$index][$attribute->name] = $attribute->value; 
     } 
     foreach ($element->childNodes as $subElement) { 
      if ($subElement->nodeType == XML_TEXT_NODE) { 
       $obj[$index]["html"] = $subElement->wholeText; 
      } 
      else { 
       $obj[$index]["children"][] = element_to_obj($subElement); 
      } 
     } 
    } 

    return $obj; 
} 

$html = <<<EOF 
<!DOCTYPE html> 
<html lang="en"> 
    <head> 
     <title> This is a test </title> 
    </head> 
    <body> 
     <h1> Go to a site? </h1> 
     <ul> 
      <li> <a href="http://example.com">Some Site</a> </li> 
      <li> <a href="http://example.com">Some Site</a> </li> 
     </ul> 
     <h1> Other sites to visit: </h1> 
     <div><a href="http://example.com">Some Site</a></div> 
     <div><a href="http://example.com">Some Site</a></div> 
     <div><a href="http://example.com">Some Site</a></div> 
     <div><a href="http://example.com">Some Site</a></div> 
    </body> 
</html> 
EOF; 

header("Content-Type: text/plain"); 
echo json_encode(html_to_obj($html), JSON_PRETTY_PRINT); 
+0

이게 내가 찾고 있던 것! 귀하의 의견에서 언급 한대로 나는 관심이없는 노드를 검사하지 않으려했다. 실제 html은 꽤 큰 것이다. – MaryCoding

+0

멋지다. 구현이 오랜 시간 일하기를 원한다. 가능한 한 많은 유스 케이스를 고려해야한다. 나중에 코드 빚이 그리 많지는 않다. – gxela

0

나는 최선의 방법은 간단한 텍스트 파서를 만드는 것이라고 생각합니다. 각 JSON 객체를 검색하여 href = "의 인스턴스를 찾고 그 다음에 문자열을 반환합니다 (이스케이프되지 않은 다음 이스케이프까지). 내가 올바르게 기억한다면 Javascript에는 string.substring과 같은 기본적인 기능이 있습니다. 또는 regexes 사용법을 알고있는 경우 REGEX를 사용할 수 있습니다.

+0

이것은 자바 스크립트가 아니라 PHP 다. – Barmar

+0

사실,하지만 A : 그는 JSON을 사용하고 있습니다. B : Javascript가 뛰어나고 HTML에서 작동하고 있습니다. C : PHP 솔루션을 지정하지 않았습니다. – user3760657

+0

질문은'php' 태그가 붙어 있습니다, 그가 작성한 코드는 PHP입니다. 그것은 JSON을 생성하기 위해'DOMDocument' 객체에서 작동합니다. – Barmar