아래 코드를 사용하기 전에 HTML 소스에서 URL 목록을 grep할 수 있었지만 어떤 이유로 이 특정 예에서는 작동하지 않습니다.
그렙:
grep -1 box-download shareit1.txt|sed 's/<a/\/n/'|sed 's/href/\/n/'|grep http|cut -d\" -f2>> shareit2.txt
URL:
<div class="box-download">
<a data-no-file="0" title="SHAREit free download" href="http://gsf-cf.softonic.com/c98/1a8/173dd01ec9001985d81eb5f2023b03280c/LenovoShareIt-win.exe?SD_used=0&channel=WEB&fdh=no&id_file=69703978&instance=softonic_en&type=PROGRAM&Expires=1444364906&Signature=SdKSfTDHY4dG6HVu2--lqt8lRbGK9S1opIDZiSNwvggAAAXB3hESz1G1Y00rU5iLGY5lai0YOJBXhE4y6gvL4uQvCV4U5jzLDU9TmFTxe4xNDrEmkSC95LyGdGSudQKfrWdD06gBlVrqE49AeeotENtdA3SpkmfQGGd1tnjS138_&Key-Pair-Id=APKAJUA62FNWTI37JTGQ&filename=LenovoShareIt-win.exe" id="download-button" class="button-main-download-xl"
data-ua="#c,#l,a=Download,downloadType=HostedDownload"
>
<strong>Free Download
<span>Safe download</span>
</strong>
<i class="icon-download-alt"></i>
</a>
당신의 도움을 주셔서 감사합니다.
답변1
이 (고정된) file.html을 사용하면 다음과 같습니다.
<html>
<div class="box-download">
<a data-no-file="0" title="SHAREit free download" href="http://gsf-cf.softonic.com/c98/1a8/173dd01ec9001985d81eb5f2023b03280c/LenovoShareIt-win.exe?SD_used=0&channel=WEB&fdh=no&id_file=69703978&instance=softonic_en&type=PROGRAM&Expires=1444364906&Signature=SdKSfTDHY4dG6HVu2--lqt8lRbGK9S1opIDZiSNwvggAAAXB3hESz1G1Y00rU5iLGY5lai0YOJBXhE4y6gvL4uQvCV4U5jzLDU9TmFTxe4xNDrEmkSC95LyGdGSudQKfrWdD06gBlVrqE49AeeotENtdA3SpkmfQGGd1tnjS138_&Key-Pair-Id=APKAJUA62FNWTI37JTGQ&filename=LenovoShareIt-win.exe" id="download-button" class="button-main-download-xl" data-ua="#c,#l,a=Download,downloadType=HostedDownload">
<strong>Free Download<span>Safe download</span></strong>
<i class="icon-download-alt"></i>
</a>
</div>
</html>
주문하다:
xmlstarlet sel -t -v "//html/div/a/@href" file.html
산출:
http://gsf-cf.softonic.com/c98/1a8/173dd01ec9001985d81eb5f2023b03280c/LenovoShareIt-win.exe?SD_used=0&channel=WEB&fdh=no&id_file=69703978&instance=softonic_en&type=PROGRAM&Expires=1444364906 &S ignnatural=SdKSfTDHY4dG6HVu2--lqt8lRbGK9S1opIDZiSNwvggAAAXB3hESz1G1Y00rU5iLGY5la i0YOJBXhE4y6gvL4uQvCV4U5jzLDU9TmFTxe4xNDrEmkSC95LyGdGSudQKfrWdD06gBlVrqE 49A eeotENtdA3SpkmfQGGd1tnjS138_& 키 쌍 -Id=APKAJUA62FNWTI37JTGQ&파일 이름=LenovoShareIt-win.exe
답변2
sed 's/^[^"]* *//
s/" */"\n/2
/\n/P;D
' <in >out
이것은 한 번에 하나의 큰따옴표 컨텍스트로 입력 줄을 교대로 인쇄하고 먹습니다. 데이터를 더욱 grep
친숙하게 만들 수 있습니다. 작성된 대로 인용된 컨텍스트가 줄 바꿈을 포함할 수 있으면 작동하지 않지만, 내가 아는 한 HTML에는 있어서는 안 됩니다.
그럼에도 불구하고 샘플 작업이 더 쉬워집니다.
class="box-download"
data-no-file="0"
title="SHAREit free download"
href="http://gsf-cf.softonic.com/c98/1a8/173dd01ec9001985d81eb5f2023b03280c/LenovoShareIt-win.exe?SD_used=0&channel=WEB&fdh=no&id_file=69703978&instance=softonic_en&type=PROGRAM&Expires=1444364906&Signature=SdKSfTDHY4dG6HVu2--lqt8lRbGK9S1opIDZiSNwvggAAAXB3hESz1G1Y00rU5iLGY5lai0YOJBXhE4y6gvL4uQvCV4U5jzLDU9TmFTxe4xNDrEmkSC95LyGdGSudQKfrWdD06gBlVrqE49AeeotENtdA3SpkmfQGGd1tnjS138_&Key-Pair-Id=APKAJUA62FNWTI37JTGQ&filename=LenovoShareIt-win.exe"
id="download-button"
class="button-main-download-xl"
data-ua="#c,#l,a=Download,downloadType=HostedDownload"
class="icon-download-alt"
답변3
백슬래시가 있기 때문에 작동하지 않습니다(일을 엉망으로 만드는 StackExchange 파서가 없는 한). 속성 콘텐츠를 선택하려면 해당 콘텐츠를 새 줄에 넣고 거기서부터 잘라내야 한다는 사실을 발견했습니다. 그러나 개행 문자는 이지만 \n
가 아닙니다 \/n
. 두 번째는 " /n
, 슬래시가 문자 그대로 처리되도록 보장합니다."
따라서 수정 후에는 다음 코드가 작동합니다.
grep -1 box-download shareit1.txt|sed 's:<a:\n:'|sed 's/href/\n/'|grep http |cut -d\" -f 2
다음을 사용하여 파이프 및 외부 프로그램 호출 수를 줄일 수 있습니다 sed
.
sed -n -e '/http/ s:.*href="\([^"]*\)".*:\1: p' shareit1.txt
그건 그렇고, 어쨌든 이 모든 방법은 잘못되었습니다. 올바른 방법은 DOM/XPath를 사용하는 것입니다. 문제는 쉘에 DOM 구문 분석기가 없고(내가 아는 한) 일반 쉘 XML 구문 분석기를 사용하면 파일이 유효한 XML이 될 것으로 기대하는 XPath 표현식을 지정할 수 있다는 점입니다. 웹 사이트 콘텐츠는 거의 그렇지 않습니다. Python, Ruby 또는 Perl(시스템 관리자가 가장 일반적으로 사용하는 언어를 언급하자면)과 같은 다른 프로그래밍 언어에는 지저분한 HTML 파일을 유효한 XML 파일과 유사한 것으로 변환하고 이를 XML 구문 분석에 제공할 수 있는 라이브러리가 있습니다. 장치.
답변4
당신은 그것을 사용할 수 있습니다강아지;이것은 놀라운 도구입니다.
여기서는 파일을 다운로드한 다음 HTML 내부의 특정 링크를 파일에 추가하는 방법을 알아보세요.
wget http://domain.com -O file.html && pup 'a.className[href] attr{href}' < file.html > links.md
클래스 이름이 있는 Domain.com의 모든 링크는 className
다운로드되어 links.md
.