Heim  >  Artikel  >  Backend-Entwicklung  >  Wie extrahiere ich Daten aus Wiki-Links?

Wie extrahiere ich Daten aus Wiki-Links?

WBOY
WBOYnach vorne
2024-02-05 23:12:081022Durchsuche

Wie extrahiere ich Daten aus Wiki-Links?

Frageninhalt

Ich möchte Daten aus dem Wiki-Link extrahieren, der von der mwparserfromhell-Bibliothek zurückgegeben wird. Ich möchte zum Beispiel die folgende Zeichenfolge analysieren:

[[file:warszawa, ul. freta 16 20170516 002.jpg|thumb|upright=1.18|[[maria skłodowska-curie museum|birthplace]] of marie curie, at 16 freta street, in [[warsaw]], [[poland]].]]

Wenn ich das Zeichen | 分割字符串,则它不起作用,因为图像描述中也有一个使用 | 的链接: [[玛丽亚·斯克沃多夫斯卡-居里博物馆|出生地]] verwende.

Ich habe Regex verwendet, um zunächst alle Links in der Zeichenfolge zu ersetzen und sie dann aufzuteilen. Es funktioniert (in diesem Fall), fühlt sich aber nicht sauber an (siehe Code unten). Gibt es eine bessere Möglichkeit, Informationen aus einer solchen Zeichenfolge zu extrahieren?

import re

wiki_code = "[[File:Warszawa, ul. Freta 16 20170516 002.jpg|thumb|upright=1.18|[[Maria Skłodowska-Curie Museum|Birthplace]] of Marie Curie, at 16 Freta Street, in [[Warsaw]], [[Poland]].]]"

# Remove [[File: at the begining of the string
prefix = "[[File:"
if (wiki_code.startswith(prefix)):
    wiki_code = wiki_code[len(prefix):]

# Remove ]] at the end of the string
suffix = "]]"
if (wiki_code.endswith(suffix)):
    wiki_code = wiki_code[:-len(suffix)]

# Replace links with their
link_pattern = re.compile(r'\[\[.*?\]\]')
matches = link_pattern.findall(wiki_code)
for match in matches:
    content = match[2:-2]
    arr = content.split("|")
    label = arr[-1]
    wiki_code = wiki_code.replace(match, label)

print(wiki_code.split("|"))

Richtige Antwort


.filter_wikilinks() 返回的链接是 wikilink 类,该类具有 titletext Attribut.

  • title 返回链接的标题:file:warszawa, ul。弗雷塔16 20170516 002.jpg
  • text 返回链接的其余部分:thumb|upright=1.18|[[maria skłodowska-curie museum|birthplace]] 玛丽·居里 (marie curie),地址:16 freta street,[[华沙]],[[波兰]]。

Diese werden als wikicode Objekte zurückgegeben.

Da der eigentliche Text immer das letzte Fragment ist, müssen Sie zunächst die anderen Fragmente mithilfe des folgenden regulären Ausdrucks finden:

([^[]|]*|)+

  • ( ): Gruppe
    • [^[]|]*: 0 oder mehr Zeichen, bei denen es sich nicht um eckige Klammern oder vertikale Balken handelt
    • |: Textpipeline
  • +: 1 oder mehr

Alles andere vom letzten übereinstimmenden Endindex bis zum Ende der Zeichenfolge ist das letzte Fragment.

>>> import mwparserfromhell
>>> import re
>>> wikitext = mwparserfromhell.parse('[[File:Warszawa, ul. Freta 16 20170516 002.jpg|thumb|upright=1.18|[[Maria Skłodowska-Curie Museum|Birthplace]] of Marie Curie, at 16 Freta Street, in [[Warsaw]], [[Poland]].]]')
>>> image_link = wikitext.filter_wikilinks()[0]
>>> image_link
'[[File:Warszawa, ul. Freta 16 20170516 002.jpg|thumb|upright=1.18|[[Maria Skłodowska-Curie Museum|Birthplace]] of Marie Curie, at 16 Freta Street, in [[Warsaw]], [[Poland]].]]'
>>> image_link.title
'File:Warszawa, ul. Freta 16 20170516 002.jpg'
>>> text = str(image_link.text)
>>> text
'thumb|upright=1.18|[[Maria Skłodowska-Curie Museum|Birthplace]] of Marie Curie, at 16 Freta Street, in [[Warsaw]], [[Poland]].'
>>> other_fragments = re.match(r'([^\[\]|]*\|)+', text)
>>> other_fragments
<re.Match object; span=(0, 19), match='thumb|upright=1.18|'>
>>> other_fragments.span(0)[1]
19
>>> text[19:]
'[[Maria Skłodowska-Curie Museum|Birthplace]] of Marie Curie, at 16 Freta Street, in [[Warsaw]], [[Poland]].'

Das obige ist der detaillierte Inhalt vonWie extrahiere ich Daten aus Wiki-Links?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:stackoverflow.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen