Подтвердить что ты не робот

Самый простой способ извлечь URL-адреса с html-страницы с помощью sed или awk

Я хочу извлечь URL из тегов привязки html файла. Это нужно сделать в BASH с помощью SED/AWK. Нет perl, пожалуйста.

Каков самый простой способ сделать это?

4b9b3361

Ответ 1

Вы также можете сделать что-то подобное (при условии, что у вас установлена ​​lynx)...

Версии Lynx < 2.8.8

lynx -dump -listonly my.html

Lynx версии >= 2.8.8 (любезно предоставлено @condit)

lynx -dump -hiddenlinks=listonly my.html

Ответ 2

Вы просили об этом:

$ wget -O - http://stackoverflow.com | \
  grep -io '<a href=['"'"'"][^"'"'"']*['"'"'"]' | \
  sed -e 's/^<a href=["'"'"']//i' -e 's/["'"'"']$//i'

Это грубый инструмент, поэтому применяются все обычные предупреждения о попытке анализа HTML с помощью регулярных выражений.

Ответ 3

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 добавит новую строку перед каждым тэгом href url с помощью \n
  • Второй sed сократит каждый URL-адрес после второго "в строке, заменив его тегом /a на новую строку Оба seds дадут вам каждый URL-адрес на одной строке, но есть мусор, поэтому
  • Второй grep href очищает беспорядок.
  • Сортировка и uniq предоставят вам один экземпляр каждого существующего url, присутствующего в sourcepage.html

Ответ 5

Пример, поскольку вы не предоставили какой-либо образец

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

Ответ 6

Я сделал несколько изменений в решении Грега Бэкона

cat index.html | grep -o '<a .*href=.*>' | sed -e 's/<a /\n<a /g' | sed -e 's/<a .*href=['"'"'"]//' -e 's/["'"'"'].*$//' -e '/^$/ d'

Это устраняет две проблемы:

  • Мы сопоставляем случаи, когда привязка не начинается с href в качестве первого атрибута
  • Мы рассматриваем возможность наличия нескольких якорей в одной строке

Ответ 7

Я предполагаю, что вы хотите извлечь URL из некоторого HTML-текста, а не анализировать HTML (как предполагает один из комментариев). Верьте или нет, кто-то уже сделал это.

OT: на сайте sed есть много полезной информации и много интересных/сумасшедших сценариев sed. Вы даже можете играть в Сокобана в седе!

Ответ 8

Вы можете сделать это довольно легко с помощью следующего регулярного выражения, которое неплохо находит URL-адреса:

\b(([\w-]+://?|www[.])[^\s()<>]+(?:\([\w\d]+\)|([^[:punct:]\s]|/)))

Я взял это из статьи Джона Грубера о том, как найти URL в тексте.

Это позволяет найти все URL-адреса в файле f.html следующим образом:

cat f.html | grep -o \
    -E '\b(([\w-]+://?|www[.])[^\s()<>]+(?:\([\w\d]+\)|([^[:punct:]\s]|/)))'

Ответ 9

В bash должно работать следующее. Обратите внимание, что он не использует sed или awk, но использует tr и grep, оба очень стандартные и не perl ;-)

$ 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...

Ответ 10

Перейдите с первым проходом, заменив начало URL (http) на новую строку (\n http). Тогда вы сами убедитесь, что ваша ссылка начинается в начале строки и является единственным URL-адресом на линии.

Остальное должно быть легким, вот пример:

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"; }; _'

Ответ 11

Расширение на ответ kerkael:

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"

Первый grep, который я добавил, удаляет ссылки на локальные закладки.

Вторая удаляет относительные ссылки на верхние уровни.

Третий удаляет ссылки, которые не начинаются с http.

Выберите и выберите, какой из них вы используете в соответствии с вашими конкретными требованиями.

Ответ 12

Вы можете попробовать:

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>&nbsp;<\/td>//g'| column -c2 -t|awk '{print $1}'

Ответ 13

Как я попробовал это для лучшего просмотра, создаю файл оболочки и даю ссылку как параметр, он создаст файл temp2.txt.

a=$1

lynx -listonly -dump "$a" > temp

awk 'FNR > 2 {print$2}' temp > temp2.txt

rm temp

>sh test.sh http://link.com

Ответ 14

Это мой первый пост, поэтому я стараюсь объяснить, почему я публикую этот ответ...

  • Начиная с первых 7 наиболее проголосовавших ответов, 4 включают GREP, даже если post явно говорит "использование только sed или awk".
  • Даже если сообщение требует "Без perl please", из-за предыдущего point, а также потому, что используйте регулярное выражение PERL внутри grep.
  • и потому, что это самый простой способ (насколько я знаю, и требуется) сделать это в BASH.

Итак, вот самый простой script из GNU grep 2.28:

grep -Po 'href="\K.*?(?=")'

О переключателе \K, а не информация была создана на страницах MAN и INFO, поэтому я пришел здесь для ответа.... переключатель \K избавится от предыдущих символов (и самого ключа). Имейте в виду следующие советы: "Это очень экспериментально, и grep -P может предупредить о нереализованных функциях".

Конечно, вы можете изменить script, чтобы соответствовать вашим вкусам или потребностям, но я нашел это довольно прямо для того, что было запрошено в сообщении, а также для многих из нас...

Надеюсь, вам это очень понравится.

спасибо!!!