2017-08-07 4 views
0

J'utilise wikipedia api pour récupérer des données sur l'infobox. Je veux analyser website url à partir de ces données d'infobox. J'ai essayé d'utiliser mwparserfromhell pour analyser l'URL du site, mais il existe différents formats pour différents mots clés.Parse Site web de Wikipédia Infobox data

Voici quelques modèles pour le site Web -

url     = <!-- {{URL|www.example.com}} --> 
| url = [https://www.TheGuardian.com/ TheGuardian.com] 
| url = <span class="plainlinks">[https://www.naver.com/ www.naver.com]</span> 
|url    = [https://www.tmall.com/ tmall.com] 
|url   = [http://www.ustream.tv/ ustream.tv] 

je besoin d'aide dans l'analyse syntaxique official website link pour tous les modèles pris en charge par wikipedia?

Edition -

Code -

# get infobox data 
import requests 
# keyword 
keyword = 'stackoverflow.com' 
# wikipedia api url 
api_url = (
    'https://en.wikipedia.org/w/api.php?action=query&prop=revisions&' 
    'rvprop=content&titles=%s&rvsection=0&format=json' % keyword) 
# api request 
resp = requests.get(api_url).json() 
page_one = next(iter(resp['query']['pages'].values())) 
revisions = page_one.get('revisions', []) 
# infobox daa 
infobox_data = next(iter(revisions[0].values())) 

# parse website url 
import mwparserfromhell 
wikicode = mwparserfromhell.parse(infobox_data) 
templates = wikicode.filter_templates() 
website_url_1 = '' 
website_url_2 = '' 
for template in templates: 
    # Pattern - `URL|http://x.com` 
    if template.name == "URL": 
     website_url_1 = str(template.get(1).value) 
     break 
    if not website_url_1: 
     # Pattern - `website = http://x.com` 
     try: 
      website_url_2 = str(template.get("website").value) 
     except ValueError: 
      pass 
    if not website_url_1: 
     # Pattern - `homepage = http://x.com` 
     try: 
      website_url_2 = str(template.get("homepage").value) 
     except ValueError: 
      pass 
if website_url_1: 
    website_url = website_url_1 
elif website_url_2: 
    website_url = website_url_2 
+0

Pouvez-vous montrer votre code? mwparserfromhell devrait être capable de faire face à tout cela (sauf le premier qui n'affiche pas réellement un lien). – Tgr

+0

@Tgr ajouté le code que j'utilise. Il ne couvre que quelques cas. –

Répondre

0

On peut analyser les modèles dont vous avez parlé à l'aide d'une expression rationnelle et BeautifulSoup. Il est concevable que l'on puisse analyser des modèles supplémentaires en étendant cette approche.

Je supprime les éléments qui incluent 'url =' depuis le début d'une ligne, puis j'utilise BeautifulSoup pour gérer le reste. Puisque BeautifulSoup encapsule ce qui est donné pour former une page complète, le contenu original peut être obtenu comme le texte de l'élément body.

>>> import re 
>>> patterns = '''\ 
... url     = <!-- {{URL|www.example.com}} --> 
... | url = [https://www.TheGuardian.com/ TheGuardian.com] 
... | url = <span class="plainlinks">[https://www.naver.com/ www.naver.com]</span> 
... |url    = [https://www.tmall.com/ tmall.com] 
... |url   = [http://www.ustream.tv/ ustream.tv]''' 
>>> import bs4 
>>> regex = re.compile(r'\s*\|?\s*url\s*=\s*', re.I) 
>>> for pattern in patterns.split('\n'): 
...  soup = bs4.BeautifulSoup(re.sub(regex, '', pattern), 'lxml') 
...  if str(soup).startswith('<!--'): 
...   'just a comment' 
...  else: 
...   soup.find('body').getText() 
... 
'just a comment' 
'[https://www.TheGuardian.com/ TheGuardian.com]' 
'[https://www.naver.com/ www.naver.com]' 
'[https://www.tmall.com/ tmall.com]' 
'[http://www.ustream.tv/ ustream.tv]' 
+0

Merci, cela peut être utile si quelqu'un peut fournir une liste complète des modèles. J'ai vérifié les données de quelques centaines de pages et je n'ai trouvé aucun ensemble standard de modèles. –

+0

J'ai besoin d'une solution plus spécifique pour analyser 'site'' à partir de données api wikipedia. Tout ce qui est sur ces lignes aidera. –

+0

J'ai supposé que vous aviez fait vos recherches sur ce que les autres savent de cela. Il n'y a pas de modèle standard ou un ensemble complet de modèles. Néanmoins, vous pourriez toujours être capable de l'étendre vous-même d'une manière utile. –

0

mwparserfromhell est un bon outil pour cela:

import mwclient 
import mwparserfromhell 

site = mwclient.Site('en.wikipedia.org') 
text = site.pages[pagename].text() 
wikicode = mwparserfromhell.parse(text) 
templates = wikicode.filter_templates(matches='infobox .*') 
url = templates[0].get('url').value 

url_template = url.filter_templates(matches='url') 
url_link = url.filter_external_links() 
if url_template: 
    print url_template[0].get(1) 
elif url_link: 
    print url_link.url 
else: 
    print url 
+0

Ce code -'url = templates [0] .get ('url'). Value' ne fonctionne pas dans tous les cas. par exemple. https://en.wikipedia.org/wiki/National_Institute_of_Technology,_Karnataka Il n'y a pas d'attribut standard pour l'URL dans les données. J'ai trouvé 'site web, URL et page d'accueil' de mes observations. Connaissez-vous tous les noms d'attributs valides? –

+1

Non. Vous pourriez avoir plus de chance à poser ce genre de question sur Wikipedia (la [pompe de village technique] (https://en.wikipedia.org/wiki/Wikipedia:Village_pump_ (technique)) par exemple). – Tgr