문제

HTML 파일을 감안할 때 선택하려고 시도하는 알고리즘을 작업 중입니다. 예를 들어 다음 HTML에서 "컨텐츠"를 선택합니다.

<html>
   <body>
      <div id="header">This is the header we don't care about</div>
      <div id="content">This is the <b>Main Page</b> content.  it is the
      longest block of text in this document and should be chosen as
      most likely being the important page content.</div>
   </body>
</html>

나는 HTML 문서 트리를 잎에 가로 지르고, 텍스트의 길이를 추가하고, 부모가 아이들이하는 것보다 더 많은 내용을 제공한다면 부모가 가진 다른 텍스트 만 보는 것과 같은 몇 가지 아이디어를 생각해 냈습니다.

누구든지 이와 같은 것을 시도했거나 적용 할 수있는 알고리즘을 알고 있습니까? 견고 할 필요는 없지만 대부분의 페이지 컨텐츠 텍스트 (예 : 기사 또는 블로그 게시물의 경우)가 포함 된 컨테이너를 추측 할 수있는 한, 그것은 굉장합니다.

도움이 되었습니까?

해결책

포맷 태그를 무시하는 텍스트 블록을 찾는 앱을 만들 수 있습니다 (필요한 경우). Dom Parser를 사용하고 나무를 걷고 직계 부모를 추적하여 (출력이기 때문에)이 작업을 수행 할 수 있습니다.

부모 노드 양식을 시작하고 단지 서식하는 각 노드의 트리를 가로 지르면 해당 서브 블록 내에서 '카운트'가 계속됩니다. 콘텐츠의 문자를 계산합니다.

가장 많은 내용 블록을 찾으면 트리를 부모에게 뒤로 켜서 답을 얻으십시오.

솔루션은 DOM을 가로 지르고 스캔하는 노드를 추적하는 방법에 의존한다고 생각합니다.

어떤 언어를 사용하고 있습니까? 프로젝트에 대한 다른 세부 사항이 있습니까? 사용할 수있는 언어 별 또는 패키지 특정 도구도있을 수 있습니다.

다른 팁

한 단어: 보일러 파이프

여기에 내가 이것에 어떻게 접근하는지는 다음과 같습니다.

// get array of all elements (body is used as parent here but you could use whatever)
var elms = document.body.getElementsByTagName('*');
var nodes = Array.prototype.slice.call( elms, 0 );

// get inline elements out of the way (incomplete list)
nodes = nodes.filter(function (elm) {
  return !/^(a|br?|hr|code|i(ns|mg)?|u|del|em|s(trong|pan))$/i.test( elm.nodeName );
});

// sort elements by most text first
nodes.sort(function(a,b){
  if (a.textContent.length == b.textContent.length) return 0;
  if (a.textContent.length > b.textContent.length)  return -1;
  return 1;
});

조상 기능을 사용합니다 a.compareDocumentPosition(b), 당신은 또한이 일이 얼마나 복잡 해야하는지에 따라 정렬 (또는 그 이후) 동안 요소를 가라 앉힐 수 있습니다.

또한 노드를 선택하려는 레벨을 공식화해야합니다. 예에서 '본문'노드에는 훨씬 더 많은 양의 텍스트가 있습니다. 따라서 '부모 요소'가 정확히 무엇인지 공식화해야합니다.

또한 단어 은행이 큰 도움이된다고 말할 수 있습니다. 트위터 및 클릭과 같은 일반적인 '광고'단어 목록 및 여러 자본화 된 명사 목록. POS 태그가 있으면 정확도가 향상 될 수 있습니다. 뉴스 사이트의 경우 세계의 모든 주요 도시 목록이 분리하는 데 도움이 될 수 있습니다. 실제로 HTML을 보지 않고도 페이지를 거의 긁어 낼 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top