2012-07-04 4 views
0

우선, 비슷한 질문을 많이 봤습니다. regex 또는 dom 사용할 수 있지만 DOM 및 정규식 좋은 예제를 찾을 수 없다는 것을 알고 내 머리를 끌어 당긴다. 또한 html 소스에서 여러 값을 가져와야하며 일부 내용은 일부 특성을 가져와야합니다. "메시지"블록이 한 번 또는 수백 번 발생할 수 있습니다HTML에서 정보를 추출 하시겠습니까?

<div class="log"> 
    <div class="message"> 
     <abbr class="dt" title="time string"> 
      DATA_1 
     </abbr> 
     : 
     <cite class="user"> 
      <a class="tel" href="tel:+xxxx"> 
       <abbr class="fn" title="DATA_2"> 
        Me 
       </abbr> 
      </a> 
     </cite> 
     : 
     <q> 
      DATA_3 
     </q> 
    </div> 
</div> 

: 여기

내가로부터 정보를 얻을하는 데 필요한 HTML의 예입니다. SimpleXML을을 사용하여

array(4) { 
    [0] => array(3) { 
       ["time"] => "DATA_1" 
       ["name"] => "DATA_2" 
       ["message"] => "DATA_3" 
      } 
    [1] => array(3) { 
       ["time"] => "DATA_1" 
       ["name"] => "DATA_2" 
       ["message"] => "DATA_3" 
      } 
    [2] => array(3) { 
       ["time"] => "DATA_1" 
       ["name"] => "DATA_2" 
       ["message"] => "DATA_3" 
      } 
    [3] => array(3) { 
       ["time"] => "DATA_1" 
       ["name"] => "DATA_2" 
       ["message"] => "DATA_3" 
      } 
} 

내가 시도했지만 매우 간단한 HTML 페이지를 작업 할 것 같다 :이 같은 데이터와 끝까지 노력하고 있어요. 누군가가 나를 몇 가지 예와 연결시킬 수 있을까? title 속성에서 DATA_2를 가져와야하므로 혼란 스럽습니다. 자신의 데이터를 추출하는 가장 좋은 방법은 무엇이라고 생각하십니까? 그것은 내가 한 XML 추출과 매우 유사하지만 다른 방법을 사용해야합니다.

+0

추출 할 URL은 무엇입니까? –

+0

DOM 기능을 살펴 보셨습니까? http://php.net/manual/en/book.dom.php – Robbie

+0

데이터 추출을위한 또 다른 좋은 라이브러리는 웹 페이지를 크롤링하기 위해 이미 사용하고있는 jQuery와 비슷한 방식으로 작동하기 때문에 phpQuery입니다. – scottheckel

답변

2

여기에 DOMDocumentDOMXpath을 사용하여 HTML을 구문 분석하는 예입니다.

$doc = new DOMDocument; 
$doc->loadHTMLFile('your_file.html'); 
$xpath = new DOMXpath($doc); 

$res = array(); 

foreach ($xpath->query('//div[@class="message"]') as $elem) { 
    $res[] = array(
     'time' => $xpath->query('abbr[@class="dt"]', $elem)->item(0)->nodeValue, 
     'name' => $xpath->query('cite/a/abbr[@class="fn"]', $elem)->item(0)->getAttribute('title'), 
     'message' => $xpath->query('q', $elem)->item(0)->nodeValue, 
    ); 
} 
+0

와우 ... 인상적입니다. 하나의 작은 문제가 있지만, 그것은 요소 0에 머물러 있고 나는 이유가 없습니다. 나는 DOM이 어떻게 작동하는지 전혀 모른다. 나는 처음부터 무언가를 만들어 simplehtmldom의 문서를보고 만들려고 노력하고 있었지만 방금 시간이 많이 절약되었습니다! –

+0

'$ xpath-> query()'는 항상 요소 목록을 반환하므로 일반적으로 루프 내에서 요소를 가져 오거나 간단히'item (0)','item (1)','item (2)'등을 가져옵니다. ' ...'만 있다는 것을 알기 때문에'item (0)'으로 가져올 수 있습니다. – flowfree

+0

흠 ... 나는 그것을 테스트하고 같은 일을 반복해서 ... –

0

xPath를 사용 하시겠습니까? 그것은 당신이하고 싶은 것을위한 완벽한 후보자처럼 보입니다 (하지만 당신이 묻는 것을 오해 할 수도 있습니다).

XPath를 사용하면 XML/HTML 트리의 특정 노드를 선택하고 거기에서 조작 할 수 있습니다. 그 후, 그것은 간단한 작업 (또는 대부분의 간단한 정규식의 작은 비트. 개인적으로, 나는 정규식을 사랑하므로, 당신이 그 도움이 필요하면 알려주십시오).

시간 (데이터 1) :

/div/div/abbr/text() 

이름 (자료 2) :

/div/div/cite/a/abbr/@title 

메시지 (

귀하의 XPath 문

는 (충돌하는 이름이 없다고 가정)과 같을 것 데이터 3) :

/div/div/q/text() 

예를 들어 속성을 통해 요소를 식별하려는 경우 이보다 더 많은 기술을 얻을 수 있지만, 내가 준 기술은 매우 빠릅니다.

관련 문제