Вопрос или проблема
Я могу скачать отдельный файл 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 следующим образом можно автоматизировать процесс:
- Создайте файл скрипта под названием
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
- Сделайте скрипт исполняемым:
chmod +x html_to_title.sh
- Запустите скрипт:
./html_to_title.sh https://www.bbc.co.uk/news/articles/c99rgj0xkryo
Данный скрипт загружает страницу, обрабатывает HTML с помощью tidy
, извлекает заголовок и переименовывает файл согласно заголовку страницы.
Скрипт для Windows (PowerShell)
Вот аналог сценария для Windows, использующий PowerShell:
- Создайте файл 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
- Запустите скрипт с нужным URL:
.\Get-PageTitle.ps1 "https://www.bbc.co.uk/news/articles/c99rgj0xkryo"
Примечания по безопасности имен файлов
При извлечении заголовка для использования в имени файла важно обработать лишние символы, такие как /
, \
, ?
, *
, и другие, которые могут вызвать ошибки в файловой системе. Оба скрипта включают обработку таких символов.
Заключение
Использование скриптов для автоматизации процедуры загрузки страниц с именами файлов, основанными на заголовках страниц, значительно упрощает работу. Данная методология может быть полезной в различных сценариях, от веб-архивирования до создания резервных копий важных веб-ресурсов. Применяя представленные решения, вы можете оптимизировать свои рабочие процессы и улучшить эффективность работы с веб-контентом.