sed 또는 awk 만 사용하여 html 페이지에서 URL을 추출하는 가장 쉬운 방법
html 파일의 앵커 태그 내에서 URL을 추출하고 싶습니다. 이 작업은 SED / AWK를 사용하여 BASH에서 수행해야합니다. 펄 제발.
이를 수행하는 가장 쉬운 방법은 무엇입니까?
다음과 같이 할 수도 있습니다 (lynx가 설치되어있는 경우) ...
Lynx 버전 <2.8.8
lynx -dump -listonly my.html
Lynx 버전> = 2.8.8 (@condit 제공)
lynx -dump -hiddenlinks=listonly my.html
당신은 그것을 요구했습니다 :
$ wget -O - http://stackoverflow.com | \
grep -o '<a href=['"'"'"][^"'"'"']*['"'"'"]' | \
sed -e 's/^<a href=["'"'"']//' -e 's/["'"'"']$//'
이것은 조잡한 도구이므로 정규식으로 HTML을 구문 분석하려는 시도에 대한 모든 일반적인 경고가 적용됩니다.
grep "<a href=" sourcepage.html
|sed "s/<a href/\\n<a href/g"
|sed 's/\"/\"><\/a>\n/2'
|grep href
|sort |uniq
- 첫 번째 grep은 URL이 포함 된 줄을 찾습니다. 로컬 페이지 만보고 싶다면 뒤에 더 많은 요소를 추가 할 수 있으므로 http는 없지만 상대 경로는 없습니다.
- 첫 번째 sed는 각 a href URL 태그 앞에 \ n
- 두 번째 sed는 줄에서 두 번째 "다음에 나오는 각 URL을 줄 바꿈으로 / a 태그로 대체 하여 줄입니다. 두 sed는 각 URL을 한 줄에 제공하지만 쓰레기가 있습니다.
- 두 번째 grep href는 엉망을 정리합니다.
- sort 및 uniq는 sourcepage.html에있는 각 기존 URL의 인스턴스를 하나씩 제공합니다.
으로 Xidel - HTML / XML 데이터 추출 도구 , 이것은을 통해 수행 할 수 있습니다 :
$ xidel --extract "//a/@href" http://example.com/
절대 URL로 변환 :
$ xidel --extract "//a/resolve-uri(@href, base-uri())" http://example.com/
샘플을 제공하지 않았으므로 예
awk 'BEGIN{
RS="</a>"
IGNORECASE=1
}
{
for(o=1;o<=NF;o++){
if ( $o ~ /href/){
gsub(/.*href=\042/,"",$o)
gsub(/\042.*/,"",$o)
print $(o)
}
}
}' index.html
Greg Bacon Solution을 약간 변경했습니다.
cat index.html | grep -o '<a .*href=.*>' | sed -e 's/<a /\n<a /g' | sed -e 's/<a .*href=['"'"'"]//' -e 's/["'"'"'].*$//' -e '/^$/ d'
이렇게하면 두 가지 문제가 해결됩니다.
- 앵커가 첫 번째 속성으로 href로 시작하지 않는 경우를 찾습니다.
- 같은 줄에 여러 앵커가있을 가능성을 다루고 있습니다.
나는 당신이 일부 HTML 텍스트에서 URL을 추출하고 HTML을 구문 분석하지 않기를 원한다고 가정합니다 (주석 중 하나가 제안한 것처럼). 믿거 나 말거나 누군가 이미이 작업을 수행했습니다 .
OT : sed 웹 사이트 에는 많은 좋은 정보와 흥미롭고 미친 sed 스크립트가 많이 있습니다. sed에서 Sokoban 을 재생할 수도 있습니다 !
다음 정규식을 사용하면 URL을 쉽게 찾을 수 있습니다.
\b(([\w-]+://?|www[.])[^\s()<>]+(?:\([\w\d]+\)|([^[:punct:]\s]|/)))
텍스트에서 URL을 찾는 방법에 대한 John Gruber의 기사 에서 가져 왔습니다 .
그러면 다음과 같이 f.html 파일에서 모든 URL을 찾을 수 있습니다.
cat f.html | grep -o \
-E '\b(([\w-]+://?|www[.])[^\s()<>]+(?:\([\w\d]+\)|([^[:punct:]\s]|/)))'
bash에서는 다음이 작동합니다. 이 나오지이나 AWK,하지만 사용하지 않습니다 사용 tr
하고 grep
, 모두 매우 표준이 아닌 펄 ;-)
$ cat source_file.html | tr '"' '\n' | tr "'" '\n' | grep -e '^https://' -e '^http://' -e'^//' | sort | uniq
예를 들면 :
$ curl "https://www.cnn.com" | tr '"' '\n' | tr "'" '\n' | grep -e '^https://' -e '^http://' -e'^//' | sort | uniq
생성
//s3.amazonaws.com/cnn-sponsored-content
//twitter.com/cnn
https://us.cnn.com
https://www.cnn.com
https://www.cnn.com/2018/10/27/us/new-york-hudson-river-bodies-identified/index.html\
https://www.cnn.com/2018/11/01/tech/google-employee-walkout-andy-rubin/index.html\
https://www.cnn.com/election/2016/results/exit-polls\
https://www.cnn.com/profiles/frederik-pleitgen\
https://www.facebook.com/cnn
etc...
Go over with a first pass replacing the start of the urls (http) with a newline (\n
http). Then you have guaranteed for yourself that your link starts at the beginning of the line and is the only URL on the line.
The rest should be easy, here is an example:
sed "s/http/\nhttp/g" <(curl "http://www.cnn.com") | sed -n "s/\(^http[s]*:[a-Z0-9/.=?_-]*\)\(.*\)/\1/p"
alias lsurls='_(){ sed "s/http/\nhttp/g" "${1}" | sed -n "s/\(^http[s]*:[a-Z0-9/.=?_-]*\)\(.*\)/\1/p"; }; _'
Expanding on kerkael's answer:
grep "<a href=" sourcepage.html
|sed "s/<a href/\\n<a href/g"
|sed 's/\"/\"><\/a>\n/2'
|grep href
|sort |uniq
# now adding some more
|grep -v "<a href=\"#"
|grep -v "<a href=\"../"
|grep -v "<a href=\"http"
The first grep I added removes links to local bookmarks.
The second removes relative links to upper levels.
The third removes links that don't start with http.
Pick and choose which one of these you use as per your specific requirements.
You can try:
curl --silent -u "<username>:<password>" http://<NAGIOS_HOST/nagios/cgi-bin/status.cgi|grep 'extinfo.cgi?type=1&host='|grep "status"|awk -F'</A>' '{print $1}'|awk -F"'>" '{print $3"\t"$1}'|sed 's/<\/a> <\/td>//g'| column -c2 -t|awk '{print $1}'
That's how I tried it for better view, create shell file and give link as parameter, it will create temp2.txt file.
a=$1
lynx -listonly -dump "$a" > temp
awk 'FNR > 2 {print$2}' temp > temp2.txt
rm temp
>sh test.sh http://link.com
This is my first post, so I try to do my best explaining why I post this answer...
- Since the first 7 most voted answers, 4 include GREP even when the post explicitly says "using sed or awk only".
- Even when the post requires "No perl please", due to the previous point, and because use PERL regex inside grep.
- and because this is the simplest way ( as far I know , and was required ) to do it in BASH.
So here come the simplest script from GNU grep 2.28:
grep -Po 'href="\K.*?(?=")'
About the \K
switch , not info was founded in MAN and INFO pages, so I came here for the answer.... the \K
switch get rid the previous chars ( and the key itself ). Bear in mind following the advice from man pages: "This is highly experimental and grep -P may warn of unimplemented features."
Of course, you can modify the script to meet your tastes or needs, but I found it pretty straight for what was requested in the post , and also for many of us...
I hope folks you find it very useful.
thanks!!!
ReferenceURL : https://stackoverflow.com/questions/1881237/easiest-way-to-extract-the-urls-from-an-html-page-using-sed-or-awk-only
'IT story' 카테고리의 다른 글
컨트롤러 사양 알 수없는 키워드 : id (0) | 2021.01.05 |
---|---|
개발 SSL에 makecert 사용 (0) | 2021.01.05 |
다른 필드가 비어있는 경우에만 필드의 존재 여부 확인-Rails (0) | 2021.01.05 |
나뭇 가지에 두 줄을 결합하는 방법? (0) | 2021.01.05 |
Android 발리 라이브러리에서 쿠키 사용 (0) | 2021.01.05 |