А АSunday, 1 February 2026

Експорт окремих закладок web-браузера.


Привіт.

Іноді я маю потребу експортувати з закладок web-браузера тільки одну папку, щоб перекинути її в інший браузер.

Нажаль  Chrome не має такої опції. Він експортує ВСІ закладки в один html-файл. Або можно "позичити" те саме одним файлом Bookmarks у json-форматі. Але, знову ж таки, будемо мати ВСІ закладки разом. 

А потім копіпастом вирізати собі потрібне. Але якщо таке трапляється часто то варто автоматизувати такі рухи.

Тоді я за допомогою ChatGPT зробив це так:

<#
    Export bookmarks folder by NAME from HTML (Netscape format)
    Works with exported bookmarks.html from any Chromium browser
#>

# ================== НАСТРОЙКИ ==================
# копія Bookmarks
$BookmarksHtml = "C:\tmp\Bookmarks.html"

# ІМ'Я папки, яку шукаємо
$FolderName = "MyFolder"

# куди експортувати HTML
$OutputHtml = "c:\tmp\$FolderName-bookmarks.html"


# ---------- перевірка ----------

if (-not (Test-Path $BookmarksHtml)) {
    Write-Host "❌ Файл не знайдено: "
    return
}

# ---------- створюємо DOM через COM ----------

$ie = New-Object -ComObject "HTMLFile"
$htmlContent = Get-Content $BookmarksHtml -Raw
$ie.IHTMLDocument2_write($htmlContent)
$ie.close()

# ---------- рекурсивна функція для пошуку папки за H3 ----------

function Find-FolderByNameHtml {
    param (
        $ParentNode,
        [string]$Name
    )

    foreach ($child in $ParentNode.children) {

        if ($child.tagName -eq "DT") {

            # перевіряємо чи всередині є H3
            $h3 = $child.getElementsByTagName("H3") | Select-Object -First 1
            if ($h3 -and $h3.innerText -eq $Name) {
                # знайшли потрібну папку — повертаємо DT
                return $child
            }

            # якщо є DL всередині, рекурсивно йдемо далі
            $dl = $child.getElementsByTagName("DL") | Select-Object -First 1
            if ($dl) {
                $found = Find-FolderByNameHtml -ParentNode $dl -Name $Name
                if ($found) { return $found }
            }
        }
        elseif ($child.tagName -eq "DL") {
            $found = Find-FolderByNameHtml -ParentNode $child -Name $Name
            if ($found) { return $found }
        }
    }

    return $null
}

# ---------- старт пошуку з BODY ----------

$body = $ie.body
$folderDT = Find-FolderByNameHtml -ParentNode $body -Name $FolderName

if (-not $folderDT) {
    Write-Host "❌ Папку '$FolderName' не знайдено"
    return
}

# ---------- генеруємо новий HTML ----------

$dl = $folderDT.getElementsByTagName("DL") | Select-Object -First 1
$h3 = $folderDT.getElementsByTagName("H3") | Select-Object -First 1

$html = @"
<!DOCTYPE NETSCAPE-Bookmark-file-1>
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=UTF-8">
<TITLE>Bookmarks</TITLE>
<H1>Bookmarks</H1>
<DL><p>
<DT><H3>$($h3.innerText)</H3>
$($dl.outerHTML)
</DL><p>
"@

$html | Out-File -Encoding UTF8 $OutputHtml

Write-Host ""
Write-Host "✅ Експорт завершено"
Write-Host "Папка: $FolderName"
Write-Host "Файл:  $OutputHtml"
Write-Host ""

Або так якщо ви поцупили Bookmakrs напряму:

<# 
    Export bookmarks folder by NAME only
    Works with copy of Chromium Bookmarks file
#>

# копія Bookmarks
$BookmarksCopy = "C:\tmp\Bookmarks"

# ІМ'Я папки, яку шукаємо
$FolderName = "MyFolder"

# куди експортувати HTML
$OutputHtml = "c:\tmp\$FolderName-bookmarks.html"

# ---------- перевірки ----------

if (-not (Test-Path $BookmarksCopy)) {
    Write-Host "❌ Файл не знайдено: $BookmarksCopy"
    return
}

try {
    $json = Get-Content $BookmarksCopy -Raw | ConvertFrom-Json
}
catch {
    Write-Host "❌ Неможливо прочитати JSON"
    return
}


# ---------- рекурсивний пошук папки по name ----------

function Find-FolderByName {
    param (
        $Node,
        [string]$Name
    )

    if ($Node.type -eq "folder" -and $Node.name -eq $Name) {
        return $Node
    }

    if ($Node.children) {
        foreach ($child in $Node.children) {
            $found = Find-FolderByName -Node $child -Name $Name
            if ($found) { return $found }
        }
    }

    return $null
}


# ---------- пошук у всіх коренях ----------

$roots = @(
    $json.roots.bookmark_bar,
    $json.roots.other,
    $json.roots.synced
)

$folder = $null

foreach ($root in $roots) {
    $folder = Find-FolderByName -Node $root -Name $FolderName
    if ($folder) { break }
}

if (-not $folder) {
    Write-Host "❌ Папку '$FolderName' не знайдено"
    return
}


# ---------- HTML експорт ----------

function Export-ToHtml {
    param (
        $Node,
        [int]$Indent = 1
    )

    $space = "    " * $Indent
    $html = ""

    if ($Node.type -eq "folder") {

        $html += "$space<DT><H3>$($Node.name)</H3>`n"
        $html += "$space<DL><p>`n"

        foreach ($child in $Node.children) {
            $html += Export-ToHtml -Node $child -Indent ($Indent + 1)
        }

        $html += "$space</DL><p>`n"
    }
    elseif ($Node.type -eq "url") {

        $html += "$space<DT><A HREF=""$($Node.url)"">$($Node.name)</A>`n"
    }

    return $html
}


# ---------- фінальний HTML ----------

$html = @"
<!DOCTYPE NETSCAPE-Bookmark-file-1>
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=UTF-8">
<TITLE>Bookmarks</TITLE>
<H1>Bookmarks</H1>
<DL><p>
$(Export-ToHtml -Node $folder)
</DL><p>
"@

$html | Out-File -Encoding UTF8 $OutputHtml


Write-Host ""
Write-Host "✅ Експорт завершено"
Write-Host "Папка: $FolderName"
Write-Host "Файл:  $OutputHtml"
Write-Host ""

Щасти.

No comments:

Post a Comment

А что вы думаете по этому поводу?

Версия на печать

Популярное