페이지에서 링크를 찾는 bash 스크립트를 작성 중입니다. 페이지에서 소스 코드를 다운로드하고 그 안에 있는 링크를 찾습니다.ㅏ태그를 지정하고 배열에 저장합니다.$link.그러나 문제는 일부 링크에는 전체 URL이 포함되지 않고 하위 페이지나 파일만 포함된다는 것입니다. 페이지의 소스 코드가 다음과 같다고 가정합니다.
<h1>Julian's crappy webpage</h1>
<a href="http://one.com">Page One</a>
<a href="https://two.com">Page Two</a>
<a href="/three">Page Three</a>
<a href="four">Page Four</a>
링크가 발견되면 배열은 다음과 같습니다.
http://one.com
https://two.com
/three
four
나도 변수가 있다$url이는 '와 같은 유효한 URL입니다.https://google.com"
모든 아이템을 만들 수 있는 방법이 필요해요$link프로젝트에 따라 다른 일을 하는 것이 효과적입니다. 각 항목에 대해$link:
- 항목이 /로 시작하는 경우 다음을 병합합니다.$url+${링크[n]}
- 항목이 "/", "https://" 또는 "http://"로 시작하지 않는 경우 다음을 결합하세요.$url+"/"+${링크[n]}
예를 들어 위의 예상 응답은 다음과 같습니다.
http://one.com
https://two.com
https://google.com/three
https://google.com/four
답변1
이를 달성하는 데 사용할 수 있는 샘플 스크립트는 다음과 같습니다.
#!/bin/bash
shopt -s extglob
readonly URL="https://google.com"
links=($(grep -o -P '(?<=href=").*(?=")' source.html)) # read into array
for ((i=0; i<${#links[@]}; i++))
do
case ${links[$i]} in
http*)
: # do nothing
;;
/*)
links[$i]="$URL"${links[$i]}; # update array
;;
*)
links[$i]="$URL/"${links[$i]}; # update array
;;
esac
done
source.html
현재 디렉터리에 있는 웹 페이지의 다운로드 소스로 가정됩니다 .
답변2
정규식을 사용하여 HTML을 구문 분석하는 방법은 셀 수 없이 많습니다.오류. 이는 HTML 파일에서 URL을 추출하는 것처럼 겉으로는 단순해 보이는 작업에도 해당됩니다.
따라서 정규식을 사용하지 마십시오. 다음과 같이 사용하십시오.
#! /bin/bash
htmlfile='./file.html'
URL='https://google.com'
links=($(lynx -dump -listonly -nonumbers -force_html "$htmlfile" |
sed -e "s=^file://=$URL="))
printf "%s\n" "${links[@]}"
이것이 필요하다살쾡이설치되어 있습니다. lynx
ncurses를 기반으로 한 텍스트 모드 웹 브라우저입니다. 여기서 사용된 것은 lynx
이미 해결된 HTML 파일의 링크 목록을 생성하는 것입니다.생각보다 훨씬 더 어렵다HTML 콘텐츠(브라우저 작업의 중요한 부분)에서 URL을 안정적으로 찾는 방법에 대한 문제입니다. URL을 추출하기 위해 HTML을 구문 분석하는 데 좋은 라이브러리 모듈이 있거나 perl
같은 다른 언어가 있습니다. python
쉘 스크립트의 경우 lynx
.
man lynx
자세히보다.
lynx
Linux 배포판이나 기타 UNIX 유사 운영 체제용으로 사전 패키지되어 제공되는 것이 거의 확실합니다. 그렇지 않은 경우 위 링크에서 소스 코드를 얻을 수 있습니다.