it-swarm.com.ru

Как удалить все ссылки HTML-файла в Bash или grep или batch и сохранить их в текстовом файле

У меня есть файл HTML , и он имеет около 150 тегов привязки. Мне нужны только ссылки из этих тегов, AKA, <a href="*http://www.google.com*"></a>. Я хочу получить только http://www.google.com part.

Когда я запускаю grep,

cat website.htm | grep -E '<a href=".*">' > links.txt

это возвращает мне всю строку, найденную не по той ссылке, которую я хочу, поэтому я попытался использовать команду cut :

cat drawspace.txt | grep -E '<a href=".*">' | cut -d’”’ --output-delimiter=$'\n' > links.txt

За исключением того, что это неправильно, и это не работает, я получаю некоторую ошибку о неправильных параметрах ... Так что я предполагаю, что файл тоже должен был передаваться. Может быть, как cut -d’”’ --output-delimiter=$'\n' grepedText.txt > links.txt.

Но я хотел сделать это одной командой, если это возможно ... Поэтому я попытался выполнить команду AWK .

cat drawspace.txt | grep '<a href=".*">' | awk '{print $2}’

Но и этого не будет. Он просил у меня больше информации, потому что я не закончил ....

Я попытался написать командный файл, и он сказал мне, что FINDSTR не является внутренней или внешней командой ... Поэтому я предполагаю, что мои переменные среды были испорчены и вместо того, чтобы исправить, что я попытался установить grep в Windows, но это дало мне ту же ошибку ....

Вопрос в том, как правильно удалить ссылки HTTP из HTML ? С этим я заставлю это работать для моей ситуации.

Постскриптум Я прочитал так много ссылок/сообщений о переполнении стека, что показ моих ссылок занял бы слишком много времени ... Если пример HTML необходим для демонстрации сложности процесса, я добавлю его.

У меня также есть Mac и ПК, которые я переключал между ними, чтобы использовать их команды/терминальные команды Shell/batch/grep, так что либо мне это поможет, либо поможет.

Я также хочу указать, что я в правильном каталоге

Enter image description here

HTML:

<tr valign="top">
    <td class="beginner">
      B03&nbsp;&nbsp;
    </td>
    <td>
        <a href="http://www.drawspace.com/lessons/b03/simple-symmetry">Simple Symmetry</a>  </td>
</tr>

<tr valign="top">
  <td class="beginner">
    B04&nbsp;&nbsp;
  </td>
  <td>
      <a href="http://www.drawspace.com/lessons/b04/faces-and-a-vase">Faces and a Vase</a> </td>
</tr>

<tr valign="top">
    <td class="beginner">
      B05&nbsp;&nbsp;
    </td>
    <td>
      <a href="http://www.drawspace.com/lessons/b05/blind-contour-drawing">Blind Contour Drawing</a> </td>
</tr>

<tr valign="top">
    <td class="beginner">
        B06&nbsp;&nbsp;
    </td>
    <td>
      <a href="http://www.drawspace.com/lessons/b06/seeing-values">Seeing Values</a> </td>
</tr>

Ожидаемый результат:

http://www.drawspace.com/lessons/b03/simple-symmetry
http://www.drawspace.com/lessons/b04/faces-and-a-vase
http://www.drawspace.com/lessons/b05/blind-contour-drawing
etc.
10
A'sa Dickens
$ sed -n 's/.*href="\([^"]*\).*/\1/p' file
http://www.drawspace.com/lessons/b03/simple-symmetry
http://www.drawspace.com/lessons/b04/faces-and-a-vase
http://www.drawspace.com/lessons/b05/blind-contour-drawing
http://www.drawspace.com/lessons/b06/seeing-values
21
Ed Morton

Вы можете использовать grep для этого:

grep -Po '(?<=href=")[^"]*' file

Он печатает все после href=", пока не появится новая двойная кавычка.

С вашим заданным входом он возвращает:

http://www.drawspace.com/lessons/b03/simple-symmetry
http://www.drawspace.com/lessons/b04/faces-and-a-vase
http://www.drawspace.com/lessons/b05/blind-contour-drawing
http://www.drawspace.com/lessons/b06/seeing-values

Обратите внимание, что нет необходимости писать cat drawspace.txt | grep '<a href=".*">', вы можете избавиться от бесполезного использования cat с grep '<a href=".*">' drawspace.txt.

Другой пример

$ cat a
hello <a href="httafasdf">asdas</a>
hello <a href="hello">asdas</a>
other things

$ grep -Po '(?<=href=")[^"]*' a
httafasdf
hello
18
fedorqui

Я предполагаю, что на вашем ПК или Mac по умолчанию не будет установлена ​​команда lynx (она доступна бесплатно в Интернете), но lynx позволит вам делать такие вещи:

$ lynx -dump -image_links -listonly /usr/share/xdiagnose/workloads/youtube-reload.html

Результатные:. .__ Ссылки

  1. файл: //localhost/usr/share/xdiagnose/workloads/youtube-reload.html
  2. http://www.youtube.com/v/zeNXuC3N5TQ&hl=en&fs=1&autoplay=1

В таком случае просто найти grep для строк http:. И даже могут быть параметры lynx для печати только строк http: (lynx имеет много-много параметров).

4
Michael

Согласно комментарию triplee , использование регулярных выражений для анализа файлов HTML или XML по существу не выполняется. Такие инструменты, как sed и awk, чрезвычайно эффективны для обработки текстовых файлов, но когда они сводятся к анализу данных со сложной структурой - таких как XML, HTML, JSON, ... - они являются не чем иным, как кувалдой. Да, вы можете сделать работу, но иногда с огромными затратами. Для обработки таких деликатных файлов вам нужно немного больше изящества, используя более целевой набор инструментов.

В случае парсинга XML или HTML можно легко использовать xmlstarlet .

В случае файла XHTML вы можете использовать:

xmlstarlet sel --html  -N "x=http://www.w3.org/1999/xhtml" \
               -t -m '//x:a/@href' -v . -n

где -N дает пространство имен XHTML, если оно есть, это распознается 

<html xmlns="http://www.w3.org/1999/xhtml">

Однако, поскольку HTML-страницы часто не являются правильно сформированным XML, может быть удобно немного его очистить, используя tidy . В приведенном выше примере это дает тогда:

$ tidy -q -numeric -asxhtml --show-warnings no <file.html> \
  | xmlstarlet sel --html -N "x=http://www.w3.org/1999/xhtml" \
                   -t -m '//x:a/@href' -v . -n
http://www.drawspace.com/lessons/b03/simple-symmetry
http://www.drawspace.com/lessons/b04/faces-and-a-vase
http://www.drawspace.com/lessons/b05/blind-contour-drawing
http://www.drawspace.com/lessons/b06/seeing-values
1
kvantour

Используйте grep для извлечения всех строк со ссылками в них, а затем используйте sed для извлечения URL-адресов:

grep -o '<a href=".*">' *.html | sed 's/\(<a href="\|\">\)//g' > link.txt;
0
Sathish