Benutzer:Plozessor/wikidenkmal

aus Wikipedia, der freien Enzyklopädie
Zur Navigation springen Zur Suche springen

Anleitung[Bearbeiten | Quelltext bearbeiten]

Mit dem folgenden Skript kann man die (bayerischen) Denkmalnummern aus einer oder mehreren Wikipedia-Seiten extrahieren. Es gibt drei Aufrufmöglichkeiten:

  • .\Get-WikiDenkmalNummern <url>
    
  • .\Get-WikiDenkmalNummern -url <url>
    
  • .\Get-WikiDenkmalNummern -file <datei_mit_urls>
    

Die URLs müssen auf den Wikipedia-Artikel ohne weitere Zusätze verweisen. Das Ergebnis kann in eine Variable oder eine Datei geschrieben werden, z. B.

  • $nummern = .\Get-WikiDenkmalNummern -url https://de.wikipedia.org/wiki/Liste_der_Baudenkm%C3%A4ler_in_Kronach
    

oder

  • .\Get-WikiDenkmalNummern -file urls_bamberg.txt | Out-File denkmalnummern_bamberg.txt
    

Get-WikiDenkmalNummern.ps1[Bearbeiten | Quelltext bearbeiten]

# Parameter definieren
[CmdletBinding(DefaultParameterSetName = 'Url')]
param (
    [Parameter(Position = 0, Mandatory = $true, ParameterSetName = 'Url')]
    [string]$url,

    [Parameter(Position = 0, Mandatory = $true, ParameterSetName = 'File')]
    [string]$file
)

# Quellen definieren
if ($url) {
    $urls = @($url)
}
else { 
    $urls = Get-Content $file  
}

# Listen aus Wikipedia laden
$totalcontent = ''
$urls | ForEach-Object {
    # Bei Timeout/Throttling wiederholen
    $status = 'xx'
    while ($status -ne 'OK') {
        Write-Host "Processing" $_
        $response = Invoke-WebRequest (($_.split('"')[0]) + '?action=raw')
        Start-Sleep -Seconds 1
        $status = $response.BaseResponse.StatusCode
    }

    # Nur aktuelle Denkmäler
    $activecontent = ((((((($response.Content -replace "<!--(.*?)-->", "" -split ('{{Ehemalige Bau'))[0]) -split ('{{Abgegangene '))[0] -split ('== Ehemalige Bau'))[0] -split ('== Abgegangene '))[0] -split ('{{Ehemalige Denk'))[0] -split ('==Ehemalige Denk'))[0]
    $totalcontent += $activecontent + 'Denkmalliste ' # notwendig wg. späterem Split    
}

# Quelltextkommentare, Bild- und Kategorienamen entfernen
$patterns = @('<!--([\s\S]*?)-->', 'Bild\s*=\s*(.*?)(?:\r?\n|$)', 'Commonscat\s*=\s*(.*?)(?:\r?\n|$)' )
$validcontent = $totalcontent
$patterns | ForEach-Object {
    $validcontent = [System.Text.RegularExpressions.Regex]::Replace($validcontent, $_, '')
}

# trennen bei "D-"
$items = $validcontent -split ("D-")
# trennen nach anderem Zeichen als 0123456789-, "D-" wieder einfügen
$ids = $items | ForEach-Object { "D-" + ($_ -split "[^0-9-]", 2)[0] }
# ID muss aus 4 oder 5 Elementen bestehen, IDs sortieren und Duplikate entfernen
$validids = $ids | Where-Object { $_.split("-").count -in @(4, 5) } | Sort-Object { [int]$_.split("-")[-1] }, { $_ } -Unique

# gültige IDs zurückgeben
$validids