불완전한 링크 배열 수정

불완전한 링크 배열 수정

페이지에서 링크를 찾는 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[@]}"

이것이 필요하다살쾡이설치되어 있습니다. lynxncurses를 기반으로 한 텍스트 모드 웹 브라우저입니다. 여기서 사용된 것은 lynx이미 해결된 HTML 파일의 링크 목록을 생성하는 것입니다.생각보다 훨씬 더 어렵다HTML 콘텐츠(브라우저 작업의 중요한 부분)에서 URL을 안정적으로 찾는 방법에 대한 문제입니다. URL을 추출하기 위해 HTML을 구문 분석하는 데 좋은 라이브러리 모듈이 있거나 perl같은 다른 언어가 있습니다. python쉘 스크립트의 경우 lynx.

man lynx자세히보다.

lynxLinux 배포판이나 기타 UNIX 유사 운영 체제용으로 사전 패키지되어 제공되는 것이 거의 확실합니다. 그렇지 않은 경우 위 링크에서 소스 코드를 얻을 수 있습니다.

관련 정보