두 태그 사이의 텍스트


23

<tr> </tr>html 문서에서 –이 두 태그 사이에있는 것을 검색하고 싶습니다 . 이제 html 파서를 보증하는 특정 html 요구 사항이 없습니다. 나는 단지 일치 <tr>하고 그 </tr>사이의 모든 것을 얻는 무언가가 필요 하며 여러 가지가있을 수 있습니다 tr. 나는 작동하는 awk를 시도했지만 어떤 이유로 든 추출 된 각 행의 복제본이 나옵니다.

awk '
/<TR/{p=1; s=$0}
p && /<\/TR>/{print $0 FS s; s=""; p=0}
p' htmlfile> newfile

어떻게해야합니까?


IIUC awk 스크립트는 다음과 같아야합니다 '/<tr/{p=1}; p; /<\/tr>/{p=0}'. 작동하지 않으면 입력 및 예상 출력 예를 게시하십시오.
Thor

당신 awk이 일하고 있지만 복제본을 제공하기 때문에 awk의 결과를 전달하여 sort -u구별하기 위해 노력하십시오
igiannak

답변:


14

당신 ...이 모든 <tr>...</tr>것을 원한다면 :

grep -o '<tr>.*</tr>' HTMLFILE | sed 's/\(<tr>\|<\/tr>\)//g' > NEWFILE

여러 줄의 경우 :

tr "\n" "|" < HTMLFILE | grep -o '<tr>.*</tr>' | sed 's/\(<tr>\|<\/tr>\)//g;s/|/\n/g' > NEWFILE

문자 "|"의 첫 번째 HTMLFILE을 확인하십시오. (일반적이지는 않지만 가능) 존재하는 경우 존재하지 않는 것으로 변경하십시오.


1
시작 및 종료 태그가 같은 줄에있는 경우에만 작동합니다.
l0b0

echo "bla<tr>foo</tr>bla<tr>bar</tr>bla" | grep -o '<tr>.*</tr>' | sed 's/\(<tr>\|<\/tr>\)//g'제공합니다 fooblabar. 는 bla없을 것인가?
NN

@ l0b0 맞습니다. ... 여러 줄 호환 하나 갈 것
xx4h

grep -Po '<tr>.*?</tr>'@ NN의 경우 한 줄에 하나의 결과를 반환하지만 이식성이 없습니다.
l0b0

'specs'또는 'spec-style'의 의미가 무엇인지 확실하지 않지만 웹 브라우저는 html 파서를 사용하고 html 파서 는 HTML 작성 방법에 관계없이 html을 구문 분석합니다. html이 아닌 것을 구문 분석하지는 않지만 브라우저도 구문 분석하지 않으므로 구문 분석기가 구문 분석 할 수없는 "html"을 작성하지 않아도됩니다. 즉 : 괜찮은 파서는 절대적으로 확실하게 이 작업을 수행하는 가장 좋은 건.
goldilocks

11

HTML 파서를 보증하는 요구 사항이 있습니다. HTML을 구문 분석해야합니다. Perl의 HTML :: TreeBuilder , Python의 BeautifulSoup 등은 사용하기 쉽고 복잡하고 부서지기 쉬운 정규 표현식을 작성하는 것보다 쉽습니다.

perl -MHTML::TreeBuilder -le '
    $html = HTML::TreeBuilder->new_from_file($ARGV[0]) or die $!;
    foreach ($html->look_down(_tag => "tr")) {
        print map {$_->as_HTML()} $_->content_list();
    }
' input.html

또는

python -c 'if True:
    import sys, BeautifulSoup
    html = BeautifulSoup.BeautifulSoup(open(sys.argv[1]).read())
    for tr in html.findAll("tr"):
        print "".join(tr.contents)
' input.html

9

sed그리고 awk물론이 작업에 적합하지 않습니다, 당신은 오히려 적절한 HTML 파서를 사용해야합니다. 예를 들어 hxselectw3.org에서 :

<htmlfile hxselect -s '\n' -c 'tr'

hxselect가 최선의 선택인지 모르겠습니다. 나는 그것을 사용하지 않았지만 매뉴얼 페이지는 많은 html 문서가 아닌 "올바른 형식의 XML 문서를 읽습니다"라고 말합니다. 아마도 시도할만한 가치가 있습니다. perl, python 등에서 사용할 수있는 html 파서 라이브러리 알. 그것이 옵션이라면 훨씬 나을 것입니다.
goldilocks 2013

2
@goldilocks : 최선의 선택은 상황에 따라 다릅니다. 내 경험상 hxselect잘 구성된 html / xml 문서로 꽤 잘 작동합니다. 또한 펄, 파이썬 및 다른 것보다 사용하는 것이 더 빠릅니다. 필자 hxselectsed/ awk와 파서 라이브러리 사이의 중간 정도 라고 생각 합니다.
Thor

1
작동하면 훌륭합니다! 나는 어떤 종류의 파서를 사용하는 것이 좋았 기 때문에 TechJack에주의를 기울였다. 프로그래밍 라이브러리는 더 어색하지만 html로 원격으로 전달할 수있는 모든 것을 처리해야합니다.
goldilocks

토르, hxselect좋아 보인다, 확실히 더 탐구합니다. 감사.
TechJack

@goldilocks : hxnormalize잘 구성된 html / xml 파일을 처리합니다.
tokland

5

ruby사용 가능한 경우 다음을 수행 할 수 있습니다

ruby -e 'puts readlines.join[/(?<=<tr>).+(?=<\/tr>)/m].gsub(/<\/?tr>/, "")' file

file입력 HTML 파일은 어디에 있습니까 ? 이 명령은 Ruby one-liner를 실행합니다. 먼저 모든 행을 읽고 file문자열에 조인합니다 readlines.join. 그런 다음, 문자열에서 (그러나 포함하지 않음) 사이에 그것을 선택 아무것도 <tr><\/tr>그 이상에 관계없이 줄 바꿈 한 문자 또는이다 [/(?<=<tr>).+(?=<\/tr>)/m]. 그런 다음 문자열에서 <tr>또는 </tr>문자열을 제거합니다 gsub(/<\/?tr>/, "")(중첩 tr태그 를 처리하는 데 필요함 ). 마지막으로 문자열을 인쇄합니다 puts.

당신은 HTML 파서 당신을 위해 보증하지 않고, 아주 쉽게 사용할 수 있다고 말했다 노코 기리을 함께 ruby하고 명령 간단합니다.

ruby -rnokogiri -e 'puts Nokogiri::HTML(readlines.join).xpath("//tr").map { |e| e.content }' file

-rnokogiri노코 기리 Nokogiri::HTML(readlines.join)의 모든 줄을 읽습니다 file. xpath("//tr")모든 밖으로 픽 tr요소 map { |e| e.content }사이에 무엇인지, 즉 각 요소에 대한 내용 밖으로 추천 <tr>하고 </tr>.


1

grep

tr여러 줄의 태그 내에서 내용을 검색하려면 xargs먼저 다음과 같이 전달하십시오 .

curl -sL https://www.iana.org/ | xargs | egrep -o "<tr>.*?</tr>"

내부 HTML 만 반환하려면 다음을 사용하십시오.

curl -sL https://www.iana.org/ | xargs | grep -Po "<tr>\K(.*?)</tr>" | sed "s/..tr.//g"

perlre확장 패턴 구문을 확인하십시오 .

참고 : 더 빠른 성능을 위해 ripgrep유사한 구문을 사용하는 것을 고려할 수 있습니다 .


xargs없이 더보기 좋게 인쇄되었으며 egrep -o "<script. *? </ script>"를 사용하여 인라인 자바 스크립트를 찾는 데 편리했습니다.
Andrew

0

pup

pup( CSS 선택기 를 사용하는) 예제 :

pup -f myfile.html tr

태그가없는 텍스트 만 인쇄하려면 다음을 사용하십시오 pup -f myfile.html tr text{}.

다음은 몇 가지 예입니다 curl.

curl -sL https://www.iana.org/ | pup tr text{}
pup -f <(curl -sL https://www.iana.org/) tr text{}

xpup

xpupXPath를 지원하는 HTML / XML 구문 분석을 사용 하는 예 :

xpup -f myfile.html "//tr"

0

<tr>s 의 빠른 목록 인 경우 도움이 될 수 있습니다.

perl -ne 'print if /<tr>/../</tr>/' your.html > TRs.log

건배

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.