2012-07-02 2 views
0

일부 html 파일이 있고 일부 태그 사이에 내용을 추출하고 싶습니다. 페이지 제목 태그가 지정된 콘텐츠가 여기에 있습니다.HTML 파일의 특정 태그 찾기

<p>A paragraph comes here</p> 
<p>A paragraph comes here</p><span class="more-about">Some text here</span><p class="en-cpy">Copyright &copy; 2012 </p> 

난 그냥 태그 원하는 : 머리 쪽 을하지만, 두 번째 단락에서 볼 수있는 바와 같이, 마지막 태그는 P로 시작하지만 내 욕망 태그하지 않은, 나는 그것의 내용을 원하지 않는 . 다음 스크립트를 사용하여 원하는 텍스트를 추출했지만 필자의 예제에서 마지막 태그와 같은 태그를 필터링 할 수는 없습니다 ... <p> 태그를 어떻게 추출 할 수 있습니까?

grep "<p>" $File | sed -e 's/^[ \t]*//' 

나는 그것을 추가 할 필요가, (I 출력에 표시하지 않으려는) 마지막 태그는 바로 내 원하는 태그 중 하나 (내 예에서와 같이) 및 사용 grep 명령 후 모든 그 라인의 내용은 출력으로 반환됩니다 ... (이것은 내 문제입니다)

답변

3

하지 마십시오. regex을 사용하여 의 HTML을 구문 분석하려고하면 painful이 될 것입니다. RubyNokogiri 또는 익숙한 유사한 언어 + 라이브러리를 사용하십시오.

+1

XSLT를 시도하여 URL 스크립트를 통과하는 것은 (범용 도구입니다 및 언어). 'xsltproc' 예제를위한 구글. – tripleee

+0

유효한 XHTML (즉, 유효한 XML)을 가지고 있다면 분명 더 쉬운 경로입니다 –

+0

와우, XSLT는 이상한 도구로 보이지만 시간이 없습니다. 나는 1 시간 만에 그것을해야만하고, 나는 xsl 파일을 만드는 방법을 배우는 데 시간을 소비해야만하는 것 같다. – Hakim

0
xmllint --html --xpath "//*[name()='head' or name()='p']" "$file" 

당신이 깨진 HTML을 다루는 경우 다른 파서를해야 할 수도 있습니다. 기본적으로 lxml을 사용하는 "one-liner"가 있습니다. 그냥

#!/usr/bin/env python3 
from lxml import etree 
import sys 

print('\n'.join(etree.tostring(x, encoding="utf-8", with_tail=False).decode("utf-8") for x in (lambda i: etree.parse(i, etree.HTMLParser(remove_blank_text=1, remove_comments=1)).xpath("//*[name()='p' or name()='head']"))(sys.argv[0]))) 
+0

작동하지 않습니다 ... – Hakim

+0

"작동하지 않습니다"는 아무 것도 알려주지 않습니다. 물론 libxml이 필요하거나 선택적으로 xpath를 처리 할 수있는 많은 다른 명령 행 도구를 사용할 수 있습니다. – ormaaj

+0

예, libxml을 가지고 있지만이 명령은 파일의 모든 내용을 표시합니다. – Hakim

0

이 < P>와 </P> 사이의 텍스트를 추출하기 위해,이

perl -ne 'BEGIN{$/="</p>";$\="\n"}s/.*(<p>)/$1/&&print' < input-file > output-file 

또는

perl -n0l012e 'print for m|<p>.*?</p>|gs' 
관련 문제