Benutzer:Plozessor/wikidenkmal
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