Используйте заголовок страницы в качестве имени html файла при загрузке с помощью wget.

Вопрос или проблема

Я могу скачать отдельный файл html с помощью:

wget https://www.bbc.co.uk/news/articles/c99rgj0xkryo

но wget сохранит файл как index.html, а не Nation falls silent as King leads Remembrance ceremony.html. Как заставить wget использовать заголовок страницы?

В данном случае меня не беспокоят сломанные ссылки для офлайн-файлов. Меня волнует только скачивание отдельных страниц.

Обновление: Я на Windows 11/pwsh 7.4

Флаг – это -O для wget.

wget -O "Nation falls silent as King leads Remembrance ceremony.html" https://www.bbc.co.uk/news/articles/c99rgj0xkryo

Вот скрипт, который автоматически использует заголовок для имени файла.

Вам потребуется https://www.html-tidy.org. Он доступен в репозиториях для большинства дистрибутивов.

#!/bin/bash

url="$1"

wget -O "temp_index.html" "$url"

tidy -m "temp_index.html"

title_data=$(grep "<title" "temp_index.html" | head -20 | cut -d'>' -f2-)

if [[ "$title_data" =~ "</title>" ]]; then
    title_data=$(echo "$title_data" | sed 's/........$//')
fi

mv "temp_index.html" "$title_data".html

exit 0

После нескольких тестов я заметил, что форматирование страницы приводит к тому, что </title> оказывается на следующей строке, но иногда это не так. Поэтому я добавил проверку, чтобы обработать оба сценария.

Сохраните как: html_to_title.sh
Смените режим на исполняемый: chmod +x html_to_title.sh
Использование: ./html_to_title.sh www.example.com


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

param (
    [string]$url
)

$tempFile = "temp_index.html"
Invoke-WebRequest -Uri $url -OutFile $tempFile

# Приведение HTML к красивому виду... Может ли Windows использовать tidy для этого?
$content = Get-Content -Path $tempFile -Raw
$cleanContent = $content

# Упакованный HTML не сработает, каким-то образом необходимо использовать $cleanContent для улучшения внешнего вида

Set-Content -Path $tempFile -Value $cleanContent

$titleData = ($cleanContent -match '<title(.*?)</title>') ? $matches[1] : "Без названия"

# Очистите заголовок для имени файла, если пропущены символы, добавьте их сюда
  
$titleData = $titleData -replace '[<>:"/\\|?*]', '_'  
$newFileName = "$titleData.html"
Rename-Item -Path $tempFile -NewName $newFileName

exit 0

Использование: .\Get-PageTitle.ps1 "http://example.com"

Это лучшее, что я могу сделать, когда речь идет о Windows.

Ответ или решение

Как сохранить HTML файл с заголовком страницы при использовании wget

Использование утилиты wget для загрузки веб-страниц является распространенной практикой среди IT-специалистов. Однако по умолчанию wget сохраняет загруженные HTML-файлы с именем index.html, что может быть неудобно, если необходимо сохранить веб-страницу с именем, соответствующим заголовку страницы. В этой статье мы рассмотрим, как адаптировать процесс загрузки таким образом, чтобы имя файла совпадало с заголовком страницы.

Решение с использованием wget и tidy

Используя wget и утилиту tidy, можно осуществить загрузку веб-страницы и извлечь название страницы для именования файла. У нас есть два основных способа: один для Linux и другой для PowerShell на Windows.

Скрипт для Linux

Для пользователей Linux следующим образом можно автоматизировать процесс:

  1. Создайте файл скрипта под названием html_to_title.sh и вставьте следующий код:
#!/bin/bash

url="$1"

# Загружаем страницу во временный файл
wget -O "temp_index.html" "$url"

# Обрабатываем HTML с использованием tidy
tidy -m "temp_index.html"

# Извлекаем заголовок страницы
title_data=$(grep "<title" "temp_index.html" | head -20 | cut -d'>' -f2-)

# Проверка, находится ли закрывающий тег заголовка на новой строке
if [[ "$title_data" =~ "</title>" ]]; then
    title_data=$(echo "$title_data" | sed 's/........$//')
fi

# Переименовываем временный файл
mv "temp_index.html" "$title_data.html"

exit 0
  1. Сделайте скрипт исполняемым:
chmod +x html_to_title.sh
  1. Запустите скрипт:
./html_to_title.sh https://www.bbc.co.uk/news/articles/c99rgj0xkryo

Данный скрипт загружает страницу, обрабатывает HTML с помощью tidy, извлекает заголовок и переименовывает файл согласно заголовку страницы.

Скрипт для Windows (PowerShell)

Вот аналог сценария для Windows, использующий PowerShell:

  1. Создайте файл PowerShell с введенным именем, например, Get-PageTitle.ps1:
param (
    [string]$url
)

$tempFile = "temp_index.html"
Invoke-WebRequest -Uri $url -OutFile $tempFile

# Извлекаем содержимое HTML
$content = Get-Content -Path $tempFile -Raw

# Извлекаем заголовок страницы
$titleData = ($content -match '<title>(.*?)</title>') ? $matches[1] : "Untitled"

# Безопасное именование файла
$titleData = $titleData -replace '[<>:"/\\|?*]', '_'
$newFileName = "$titleData.html"
Rename-Item -Path $tempFile -NewName $newFileName

exit 0
  1. Запустите скрипт с нужным URL:
.\Get-PageTitle.ps1 "https://www.bbc.co.uk/news/articles/c99rgj0xkryo"

Примечания по безопасности имен файлов

При извлечении заголовка для использования в имени файла важно обработать лишние символы, такие как /, \, ?, *, и другие, которые могут вызвать ошибки в файловой системе. Оба скрипта включают обработку таких символов.

Заключение

Использование скриптов для автоматизации процедуры загрузки страниц с именами файлов, основанными на заголовках страниц, значительно упрощает работу. Данная методология может быть полезной в различных сценариях, от веб-архивирования до создания резервных копий важных веб-ресурсов. Применяя представленные решения, вы можете оптимизировать свои рабочие процессы и улучшить эффективность работы с веб-контентом.

Оцените материал
Добавить комментарий

Капча загружается...