Op Wikipedia staat een Lijst van Nederlandse plaatsen.
Nu kan je eenmalig een hoop tijd besteden al deze plaatsen te copy-pasten en op een of andere manier te importeren in een database.
Een voordeel, de plaatsen zijn '-' seperated waardoor je deze makkelijk kan uitsplitsen in losse array items :
$plaatsen .= "Aadorp - Aagtdorp - Aagtekerke - Aalbeek - Aalburg - Aalden - Aalsmeer - Aalsmeerderbrug - Aalst (Gelderland) - Aalst (Noord-Brabant) - Aalsum (Friesland) - Aalsum (Groningen) - Aalten - Aan de Rijksweg - Aardenburg - Aarlanderveen - Aarle-Rixtel - Aartswoud - Aasterberg";$array_plaatsen = explode(" - ", $woonplaats);
Maar wat als er een nieuwe plaatst bijkomt ?
Ik wil de database up-to-date kunnen houden zonder al te veel moeite.
Het artikel van Wikipedia willen we kunnen uitlezen, en alle plaatsen en of nieuwe plaatsen kunnen inlezen in de database :
- 1. Inlezen van alle URL's;
- 2. Selectie op index maken van de URL's (alleen de plaatsen);
- 3. Import van plaatsnamen in de database;
- 4. Weigeren van "dubbele" plaatsnamen;
- 5. Overzicht ingelezen plaatsnamen (groen), geweigerde plaatnamen (rood).
Het opvragen van de HTML pagina :
$ch = curl_init(); curl_setopt($ch, CURLOPT_URL,"http://nl.wikipedia.org/wiki/Lijst_van_Nederlandse_plaatsen"); curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0)"); curl_setopt($ch, CURLOPT_RETURNTRANSFER,1); $html = curl_exec($ch); curl_close($ch);
De HTML content parsen naar een DOMDocument (Document Object Model) :
$dom = new DOMDocument(); @$dom->loadHTML($html);
Leuk truukje met xpath :
$xpath = new DOMXPath($dom); $hrefs = $xpath->evaluate("/html/body//a");
Het href attribuut van de plaatsnamen hebben allemaal de prefix "/wiki/" :
for ( $i = 0; $i < $hrefs->length; $i++ ) { $href = $hrefs->item($i); if ( substr($href->getAttribute('href'), 0, 6) == "/wiki/" ) $plaatsen[$i] = $href->nodeValue; }
Helaas zijn er nog er nog een paar url's maar die kunnen we handmatig via de index selectie uitsluiten :
Charter Encoding
Sommige plaatsnamen hebben speciale tekens, we willen de plaatsnaam opslaan met een UTF-8 Charter Encoding :
mysql_query("SET NAMES 'utf8'");
Weigeren van "dubbele" plaatsnamen
Als voorbeeld de plaatsnaam "Zevenhuizen" :
Het totaal aantal plaatsnamen van het artikel op Wikipedia is op dit moment 3127.
Laten we alle "dubbele" eruit, dan houden we er 2951 over.
preg_replace('/\(.*\)/', '', $value);
CREATE TABLE `cities` ( `id` int(11) NOT NULL AUTO_INCREMENT, `description` varchar(255) CHARACTER SET utf8 NOT NULL, PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;
Download : import_lijst_van_nederlandse_plaatsen.php
Meer informatie : Lijst van Nederlandse plaatsen - Wikipedia
Zie ook : AutoAanvullen van Nederlandse plaatsen