외부 HTML이 포함된 링크 가져오기

외부 HTML이 포함된 링크 가져오기

링크가 많이 포함된 html 페이지에서 특정 형식을 따르는 링크만 추출하는 방법을 찾고 있습니다.

<a href="https://always/same/link/same-name_19.html">always same text</a>
<a href="https://always/same/link/same-name_18.html">always same text</a>
<a href="https://always/same/link/same-name_17.html">always same text</a>

grep및 기타 솔루션을 사용하여 많은 솔루션을 찾았 sed지만 모두 html 태그와 "항상 동일한 텍스트" 부분 없이 내부 링크만 반환합니다.

명령줄/bash 스크립트에서 작동해야 합니다. 저는 Debian Jessie를 사용하고 있습니다. 해결책이 일방통행일 필요는 없습니다.

고쳐 쓰다

Ryan's Answer의 도움을 받아 만든 스크립트입니다.

Curl=https://always/same/link/
filename=same-name

page=`curl "$Curl$filename"`
echo $page > $filename.curl

Gurl=https://always/same/link/

# working
link=`grep -Eo '<a href="https://always/same/link/same-name_([0-9]+)\.html">always same text</a>' $filename.curl | sort | tail -n1` 

# not working; $link will be empty
link=`grep -Eo "<a href=\"https://always/same/link/same-name_([0-9]+)\.html\">always same text</a>" $filename.curl | sort | tail -n1` 

# not working; $link will be empty
link=`grep -Eo "<a href=\"${Gurl}${filename}_([0-9]+)\.html\">always same text</a>" $filename.curl | sort | tail -n1` 

# what i ended up using.
link=`grep -Eo '<a href="'${Gurl}${filename}'_([0-9]+)\.html\">always same text</a>' $filename.curl | sort | tail -n1` 
echo $link | grep -o 'https:.*[.]html'

답변1

대부분의 href 속성이 항상 동일하고 내부 텍스트도 항상 동일하며 HTML 소스 파일이 있다고 가정하면 다음과 같이 작동합니다.

grep -Eo '<a href="https://always/same/link/same-name_([0-9]+)\.html">always same text</a>' HTML-source-file

grepHTML-source-file주어진 패턴을 검색합니다 https://always/same/link/same-name_([0-9]+)\.html. 이 패턴은 다음 요소로 구성된 모든 문자열과 일치합니다(순서대로).

  1. https://always/same/link/same-name_
  2. 0부터 9까지의 숫자
  3. .html

-E플래그는 grep패턴이 확장 정규식으로 해석되도록 지시합니다.

-o플래그는 grep패턴과 일치하는 텍스트만 출력하도록 지시합니다.

변수를 사용하려면 정규식 주위에 큰따옴표를 사용하고 큰따옴표를 이스케이프 처리하면 됩니다.~에다음과 같이 백슬래시를 사용하고 변수 이름을 중괄호로 묶는 정규식입니다.

$ link_path=https://always/same/link/
$ link_name=same-name
$ grep -Eo "<a href=\"${link_path}${link_name}_([0-9]+)\.html\">always same text</a>" HTML-source-file

어떤 이유로 위의 grep큰따옴표를 이스케이프 처리할 수 없는 경우 다음을 사용할 수도 있습니다.

$ link_path=https://always/same/link/
$ link_name=same-name
$ grep -Eo '<a href="'${link_path}${link_name}'_([0-9]+)\.html">always same text</a>' HTML-source-file

관련 정보