두 레이블 사이의 텍스트

두 레이블 사이의 텍스트

<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

이 문제를 어떻게 해야 할까요?

답변1

...당신이 하고 싶은 경우 <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에서 "|" 문자(흔하지 않지만 가능함)를 확인하고, 있는 경우 존재하지 않는 문자로 변경하세요.

답변2

HTML 파서에 대한 한 가지 요구 사항이 있습니다. 즉, HTML을 구문 분석해야 합니다.진주의HTML::트리빌더, 파이썬아름다운 수프다른 것들은 복잡하고 깨지기 쉬운 정규식을 작성하는 것보다 사용하기 쉽고 쉽습니다.

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

답변3

sedawk이 작업에 적합하지 않은 경우 적절한 HTML 파서를 사용해야 합니다 . 예를 들어 hxselectw3.org의 경우:

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

답변4

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

사용예xpupHTML/XML 구문 분석의 경우(XPath 지원):

xpup -f myfile.html "//tr"

관련 정보