HTML 파일에서 URL을 추출하기 위해 grep과 cut을 사용하려고 합니다. 링크는 다음과 같습니다:
<a href="http://examplewebsite.com/">
다른 사이트에도 있지만 .net
미리 .gov
컷오프 포인트를 설정할 수 있을 줄 알았습니다 >
. 그래서 나는 grep과 cut을 사용하여 http 이전과 .com 이후의 모든 것을 어떻게든 차단할 수 있다는 것을 알고 있지만 한동안 이 문제에 갇혀 있었습니다.
답변1
도구가 제한되어 있는지 확실하지 않습니다.
그러나 위에서 언급한 것처럼 정규식은 최선의 방법이 아닐 수도 있지만 다음은 제가 정리한 예입니다.
cat urls.html | grep -Eo "(http|https)://[a-zA-Z0-9./?=_%:-]*" | sort -u
grep -E
: egrep과 동일grep -o
: grep된 내용만 출력(http|https)
:는/이거나a-z
: 모두 소문자A-Z
: 모두 대문자.
: 예/
: 슬래시입니다?
: 예?=
: 등호입니다_
: 밑줄입니다%
: 퍼센트 기호입니다:
:는 콜론이다-
: 대시입니다*
: 반복 [...] 그룹sort -u
: 모든 중복 항목을 정렬하고 제거합니다.
산출:
bob@bob-NE722:~s$ wget -qO- https://stackoverflow.com/ | grep -Eo "(http|https)://[a-zA-Z0-9./?=_-]*" | sort -u
https://stackauth.com
https://meta.stackoverflow.com
https://cdn.sstatic.net/Img/svg-icons
https://stackoverflow.com
https://www.stackoverflowbusiness.com/talent
https://www.stackoverflowbusiness.com/advertising
https://stackoverflow.com/users/login?ssrc=head
https://stackoverflow.com/users/signup?ssrc=head
https://stackoverflow.com
https://stackoverflow.com/help
https://chat.stackoverflow.com
https://meta.stackoverflow.com
...
\d
추가하여 다른 숫자 유형을 캡처 할 수도 있습니다 .
답변2
댓글에서 말했듯이, HTML을 구문 분석하기 위해 정규 표현식을 사용하는 것은 일반적으로 좋은 생각이 아니지만, 구문 분석 중인 HTML이 제대로 작동한다면 때로는 이를 사용하지 않아도 됩니다.
href
요소의 속성에서 URL 만 가져오려면 <a>
여러 단계를 거쳐 수행하는 것이 가장 쉬운 방법이라는 것을 알았습니다. 귀하의 의견에 따르면 전체 URL이 아닌 최상위 도메인 이름만 원하는 것 같습니다. 이 경우 다음과 같이 사용할 수 있습니다.
grep -Eoi '<a [^>]+>' source.html |
grep -Eo 'href="[^\"]+"' |
grep -Eo '(http|https)://[^/"]+'
source.html
구문 분석할 HTML 코드가 포함된 파일입니다 .
href
이 코드는 각 행에 있는 모든 요소의 속성으로 나타나는 모든 최상위 URL을 인쇄합니다 . 첫 번째 명령에 대한 옵션은 <a>
해당 명령이 및 요소에 적용되는지 확인하는 것입니다. 대문자 속성인 OTOH를 캡처하기 위해 두 번째 속성을 제공할 수도 있습니다. 저는 이 손상된 HTML을 무시하는 것이 좋습니다. :)-i
grep
<a>
<A>
-i
grep
HREF
콘텐츠 처리 중http://google.com/
wget -qO- http://google.com/ |
grep -Eoi '<a [^>]+>' |
grep -Eo 'href="[^\"]+"' |
grep -Eo '(http|https)://[^/"]+'
산출
http://www.google.com.au
http://maps.google.com.au
https://play.google.com
http://www.youtube.com
http://news.google.com.au
https://mail.google.com
https://drive.google.com
http://www.google.com.au
http://www.google.com.au
https://accounts.google.com
http://www.google.com.au
https://www.google.com
https://plus.google.com
http://www.google.com.au
호주 Google 페이지로 리디렉션되면 출력이 다른 예와 약간 다릅니다.
답변3
grep이 Perl 정규식을 지원하는 경우:
grep -Po '(?<=href=")[^"]*(?=")'
(?<=href=")
그리고(?=")
는주위를 둘러보세요속성의 표현입니다href
. 여기에는-P
선택이 필요합니다.-o
일치하는 텍스트를 인쇄합니다.
예를 들어:
$ curl -sL https://www.google.com | grep -Po '(?<=href=")[^"]*(?=")'
/search?
https://www.google.co.in/imghp?hl=en&tab=wi
https://maps.google.co.in/maps?hl=en&tab=wl
https://play.google.com/?hl=en&tab=w8
https://www.youtube.com/?gl=IN&tab=w1
https://news.google.co.in/nwshp?hl=en&tab=wn
...
항상 그렇듯이 이것이 유효한 URI인지 또는 구문 분석 중인 HTML이 유효한지 보장할 수 없습니다.
답변4
여기서 해결책을 찾았습니다IMHO 이것은 여기서 제안한 것보다 훨씬 간단하고 아마도 더 빠를 것입니다. https 파일을 지원하기 위해 몇 가지 조정을 했습니다. 하지만 TD;TR 버전은...
추신: 사이트 URL을 파일 경로로 바꿀 수 있으며 효과는 동일합니다.
lynx -dump -listonly -nonumbers "http://www.goggle.com" > links.txt
lynx -dump -listonly -nonumbers "some-file.html" > links.txt
링크를 파일에 저장하는 대신 링크만 보고 싶다면 다음을 시도해 보세요.
lynx -dump -listonly -nonumbers "http://www.google.com"
lynx -dump -listonly -nonumbers "some-file.html"
결과는 다음과 유사할 것입니다...
http://www.google.ca/imghp?hl=en&tab=wi
http://maps.google.ca/maps?hl=en&tab=wl
https://play.google.com/?hl=en&tab=w8
http://www.youtube.com/?gl=CA&tab=w1
http://news.google.ca/nwshp?hl=en&tab=wn
https://mail.google.com/mail/?tab=wm
https://drive.google.com/?tab=wo
https://www.google.ca/intl/en/options/
http://www.google.ca/history/optout?hl=en
...
etc.
내 사용 사례에서는 이것이 잘 작동합니다. 하지만 요즘에는 사람들이 라이브러리의 CDN URI에 src="//blah.tld"와 같은 링크를 추가한다는 점에 유의하세요. 검색된 링크에서 해당 내용을 보고 싶지 않습니다.
"lynx -dump"는 기본적으로 특정 페이지에서 클릭 가능한 모든 링크를 추출하므로 href 또는 기타 링크 소스를 확인하려고 할 필요가 없습니다. 따라서 나중에 해야 할 유일한 일은 "lynx -dump"의 결과를 grep으로 구문 분석하여 동일한 결과의 더 깨끗한 원시 버전을 얻는 것입니다.