2009-08-03 3 views
28

페이지의 검색 결과에서 지능적으로 데이터를 구문 분석하는 방법은 무엇입니까?웹 사이트 데이터를 파싱하고 사용하는 "스마트"방법?

예를 들어 많은 서점 제공 업체의 웹 사이트 검색 결과를 구문 분석하여 온라인 서적을 검색하는 웹 서비스를 만들고 싶습니다. 페이지의 원시 HTML 데이터를 가져올 수 있고 웹 서비스에 대한 데이터를 작동시키는 일부 정규식을 수행 할 수 있지만 웹 사이트 중 하나에서 페이지의 서식이 변경되면 코드가 손상됩니다!

RSS는 참으로 훌륭한 옵션이지만 많은 사이트에는 XML/JSON 기반 검색이 없습니다.

페이지에 정보를 자동으로 유포하는 데 유용한 키트가 있습니까? 미친 생각이 구문 분석 할 고정 HTML 구조없이 ... 퍼지 AI 모듈은 검색 결과 페이지에 패턴을 인식하고 그에 따라 결과를 분석하도록

+0

언어와 관련하여 필자는 PHP로 개선되었지만 필요한 경우 asp.net을 사용할 의향이 있습니다. 모든 답변 주셔서 감사합니다! – bluebit

+0

좋은 정규 표현식은 놀랍게도 유연하고 사용에 관대 할 수 있습니다. 하나의 좋은 기법은 데이터 항목 앞의 * 영역을 일치시킨 다음 게으른 한정 기호가있는 캡처 그룹에 데이터를 넣은 다음 데이터 뒤의 영역 *을 일치시키는 것입니다. 이전/이후 일치를 유연한 방식으로 정의하면 서식의 변경 사항을 매우 잘 처리 할 수 ​​있습니다. www.regular-expressions.info는이 기술 및 기타 기술에 대한 좋은 설명을 제공합니다. – BobMcGee

답변

23

나는 최근에이 작업을 수행했으며 여기에 내 경험이 있습니다.

  1. 정규 표현식 :

    세 가지 기본 방법이 있습니다.

    • 가장 유연하고 느슨하게 구조화 된 정보 및 변경 형식과 함께 사용하는 것이 가장 쉽습니다.
    • 구조적인/태그 분석이 어렵지만 텍스트 매칭이 더 쉽습니다.
    • 데이터 형식 지정의 유효성 검사가 기본 제공됩니다. 당신은 당신이 추출하는 데 사용할 각 패턴에 대한 정규 표현식을 작성해야하기 때문에
    • 세게는, 다른 것보다 유지/similarly-의 목록을 잘 일반적으로
    • 2보다 느리게, 3
    • 작품 문서를 변환 형식이 지정된 항목
    • 좋은 정규식 개발/테스트 도구와 몇 가지 샘플 페이지가 도움이 될 것입니다. 나는 RegexBuddy에 관해서 좋은 말을 해왔다. 데모를보십시오.
    • 나는 이것으로 가장 성공했습니다. 유연성을 통해 불쾌하고 잔인하고 야생의 HTML 코드로 작업 할 수 있습니다.
  2. HTML을 XHTML로 변환하고 XML 추출 도구를 사용하십시오. HTML을 정리하고 올바른 XHTML로 변환 한 다음 XPath/XQuery/X-whatever를 사용하여 XML 데이터로 쿼리합니다.
    • 도구 : TagSoup, HTMLTidy, HTML - 투 - XHML 변환 등
    • 품질은 매우 중요하고 매우 변수입니다.
    • 최적의 솔루션 경우에는 HTML 레이아웃과 태그로 구성되어 원하는 데이터 (HTML 테이블, 목록, DIV/SPAN 그룹 등의 데이터)
    • , 링크 구조, 중첩 테이블, 이미지, 목록을 가져 오는 가장 적합 so
    • 옵션 1보다 빠르지 만 옵션 3보다 느려야합니다.
    • 콘텐츠 형식이 변경되었거나/가변적이지만 문서 구조/레이아웃에서는 효과가 있습니다.
    • 데이터가 HTML 태그로 구성되지 않은 경우 문제가 발생합니다.
    • 은 옵션 (등 ANTLR) 1.
  3. 파서 생성기로 사용할 수 있습니다 - 페이지를 분석 &을 구문 분석을위한 문법을 ​​만들 수 있습니다. 내 (지저분한) 페이지에 적합하지 않았기 때문에
    • 나는이 시도하지 않은
    • 대부분의 HTML 구조는 매우, 매우 일정하게 구조화 된 정규 경우에 적합하고, 변경하지 마십시오. 쉬운 설명하는 문서에 패턴이있는 경우
    • 이 사용하지만, 그들은
    • 는 XHTML 입력을 요구하지 않습니다 일반적으로
    • 가장 빠른 처리량,
    • 를 HTML 태그를 포함하고 재귀 복잡한 행동을 포함하지 않습니다 큰 학습 곡선,하지만 쉽게 내가 옵션 2 web harvest으로 만지작 거렸다 한

유지하기 위해,하지만 난 그 구문이 종류의 이상한 찾으십시오. XML과 일부 의사 Java 스크립팅 언어가 혼합되어 있습니다. 자바가 마음에 들면 XML 스타일의 데이터 추출 (XPath, XQuery)이 당신을위한 티켓 일 것입니다.


편집 : 당신이 정규 표현식을 사용하는 경우, 당신은 게으른 수량 자 및 캡처 그룹과 라이브러리를 사용할 수 있는지 확인하십시오! PHP의 오래된 정규 표현식 라이브러리에는 이러한 태그가 없기 때문에 HTML의 열기/닫기 태그 사이에서 데이터를 일치시키는 데 필수적입니다.

3

될 것이라고, 내가 찾는 정규 표현식을 유지하기 싫어 데이터. 나무를 만드는 적절한 파서를 통해 HTML을 파싱하는 것이 더 운이 좋을 수도 있습니다. 그런 다음 요소를 선택하면 더 유지 관리가 가능합니다.

분명히 가장 좋은 방법은 엔진에서 파싱 및 유효성 검사를 할 수있는 고정 된 마크 업을 사용하는 일부 XML 출력입니다. 생성 된 트리를 '어둠 속에서'조사하는 HTML 구문 분석 라이브러리는 정규 표현식보다 유지 관리가 더 간단 할 것이라고 생각합니다.

이렇게하면 <a href="blah" class="cache_result">... 등으로 바뀌는 <a href="blah" class="cache_link">...을 확인하면됩니다.

결론, regexp로 특정 요소를 grepping하는 것은 끔찍합니다. 보다 나은 접근법은 페이지의 DOM 모델을 만들고 태그의 문자 데이터에 '앵커'를 찾는 것입니다.

에 XML API에 대한 사례가 나와있는 사이트를 이메일로 보내십시오. 고용되었을 수 있습니다!

+0

정규식을 올바르게 완료하면 유지 관리 할 수 ​​있습니다. 일부 풍미는 많은 도움을 줄 수있는 주석을 포함합니다. 캡처 링 그룹과 지연 량 한정어를 사용하여 앞뒤의 구조적 요소를 일치시키고 중간에 지연된 수량자를 사용하여 데이터를 캡처 할 수도 있습니다. DOM이나 트리 구문 분석과 같이 작동하지만 클린 XML이 필요하지 않습니다. – BobMcGee

1

html 조작 라이브러리를 사용해 보셨습니까? 루비는 꽤 좋은 것들을 가지고 있습니다. 예 : hpricot

좋은 라이브러리에서는 CSS 선택기 또는 xpath를 사용하여 원하는 페이지 부분을 지정할 수 있습니다. 이것들은 regexps를 사용하는 것보다 훨씬 튼튼합니다. Hpricot을 위키에서

예 :

doc = Hpricot(open("qwantz.html")) 
(doc/'div img[@src^="http://www.qwantz.com/comics/"]') 
    #=> Elements[...] 

난 당신이 당신이있어 어떤 언어로 말을하지 않는 등 .NET 또는 파이썬에서 비슷한 일을하는 라이브러리,

3

을 찾을 수있는 확신 사용. 자바 토지에서는 TagSoup과 XPath를 사용하여 고통을 최소화 할 수 있습니다. this blog에서 예를 들어 거기 (요구 사항이 지시대로 물론 XPath는 훨씬 더 복잡 할 수 있습니다) :

URL url = new URL("http://example.com"); 
SAXBuilder builder = new SAXBuilder("org.ccil.cowan.tagsoup.Parser"); // build a JDOM tree from a SAX stream provided by tagsoup 
Document doc = builder.build(url); 
JDOMXPath titlePath = new JDOMXPath("/h:html/h:head/h:title"); 
titlePath.addNamespace("h","http://www.w3.org/1999/xhtml"); 
String title = ((Element)titlePath.selectSingleNode(doc)).getText(); 
System.out.println("Title is "+title); 

난 당신이 사이트 변경하는 경우 보호의 어느 정도가되도록 XPath 식을 외부화 권 해드립니다.

다음은 XPath 예제입니다.이 사이트의 스크린 스크랩에는 사용하지 않습니다.말도 안돼,하지 나 : 당신이 Tag Soup 같은 것을 사용 할 수있는 경우

"//h:div[contains(@class,'question-summary')]/h:div[@class='summary']//h:h3" 
0

, 그 시작하는 장소가 될 것이다. 그런 다음 XML API와 같이 페이지를 처리 ​​할 수 ​​있습니다.

Java 및 C++ 구현이있어 작동 할 수 있습니다!

1

웹 사이트에서 HTML을 구문 분석하려고했으나 불행하게도 '긁적'이 가장 일반적인 해결책입니다. 페이지의 구조적 변화를 감지하고 수정하라는 경고를 표시 할 수 있습니다. 결국 변경으로 인해 부작용 데이터가 발생하지 않습니다. 시맨틱 웹이 현실이 될 때까지는 대용량 데이터 집합을 보장하는 유일한 방법입니다.

또는 API에서 제공하는 작은 데이터 세트를 사용할 수 있습니다. 야후는 API를 통해 검색 가능한 데이터를 제공하기 위해 열심히 노력하고 있습니다 (YDN 참조), 아마존 API가 많은 책 데이터 등을 열어 놓은 것 같습니다.

조금 도움이 되길 바랍니다!

편집 : 당신이 PHP를 사용하는 경우 내가 SimpleHTMLDOM

당신이 사용하고있는 기술 스택 당신은 언급하지 않은
2

을 권 해드립니다. 당신이 HTML을 구문 분석하는 경우, 나는 구문 분석 라이브러리를 사용하십시오 :

도 할 웹 서비스가 정확히 무엇을 다시 말하면 - 상업적이고 자유 롭다. 그들은 사이트를 긁어 내고 웹 서비스 인터페이스를 제공합니다.

일부 화면 긁기를 제공하는 일반적인 웹 서비스는 Yahoo Pipes입니다. previous stackoverflow question on that

2

정확하지는 않지만 Beautiful Soup과 같은 파서를보고 싶을 수도 있습니다. 레이아웃이 변경되면 마술처럼 같은 정보를 찾지 않지만 복잡한 정규식을 작성하는 것이 훨씬 쉽습니다. 이것은 파이썬 모듈입니다.

1

원하는 언어로 화면을 스크래핑 해보세요.

  • 아름 다운 수프
  • 기계화 : 비슷한 WWW는 펄 : 기계화 나는 파이썬을위한 몇 가지 옵션을 알고 , 당신은 원하는 언어에 대한 동등한를 찾을 수 있습니다.
  • scrapemark을 직접 libwww 바인딩 파이썬 : 당신
  • lxml이 웹 페이지에 ineract하는 객체와 같은 브라우저를 제공
  • pyquery 페이지의 조각을 긁어 템플릿을 사용하여 XML/XHTML 문서에서 jQuery를 쿼리을 할 수 있습니다
  • scrapy : 높은 수준 긁어 및 웹은 위의 방법 중 하나 이상을 사용해야합니다 긁어 웹 사이트에 따라 웹 페이지

를 크롤링 및 구문 분석 거미를 작성하기위한 프레임 워크를 크롤 링합니다.

-2

충분히 공정하게, 추천대로 태그 수프 방법을 사용하려고합니다.

지구상의 큰 긁어 냄새 유형 사이트는 어떻게합니까? 수천 개의 사이트를 검색하는 취업 검색 엔진 (예 : indeed.com)을 보았습니다! 수천 개의 정규식입니까? 그것의 불가능한 옆에 ...

0

파슬리에서 http://www.parselets.com 보이는 꽤 매끄러운.

JSON을 사용하여 'parslets'을 정의 할 수 있으며 페이지에서 무엇을 찾을 지 정의한 다음 해당 데이터를 구문 분석합니다.

+2

링크는 6 년 동안 지속되지 않습니까? –

관련 문제