如何從維基連結中提取資料?

WBOY
發布: 2024-02-05 23:12:08
轉載
1005 人瀏覽過

如何從維基連結中提取資料?

問題內容

我想從 mwparserfromhell 函式庫傳回的 wiki 連結中提取資料。 例如,我想解析以下字串:

[[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]].]]
登入後複製

如果我使用字元| 分割字串,則它不起作用,因為圖像描述中也有一個使用| 的連結:[[瑪麗亞·斯克沃多夫斯卡-居禮博物館|出生地]]

我使用正規表示式首先替換字串中的所有鏈接,然後再拆分它。它可以工作(在本例中),但感覺不乾淨(請參閱下面的程式碼)。有沒有更好的方法從這樣的字串中提取資訊?

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("|"))
登入後複製


正確答案


.filter_wikilinks() 傳回的連結是wikilink# 類,該類別具有titletext 屬性。

  • title 傳回連結的標題:file:warszawa, ul。弗雷塔16 20170516 002.jpg
  • text 回傳連結的其餘部分:thumb|upright=1.18|[[maria skłodowska-curie museum|birthplace]] 瑪麗居禮(marie curie),地址:16 freta street ,[[華沙]],[[波蘭]]。

這些傳回為 wikicode物件。

由於實際文字總是最後一個片段,因此首先需要使用以下正規表示式來尋找其他片段:

([^\[\]|]*\|)

  • #( ): 群組
    • [^\[\]|]*: 0 個或多個非方括號或垂直線的字元
    • \|:文字管道
  • :1個或多個

從最後一個符合的結束索引到字串末尾的所有其他內容都是最後一個片段。

>>> 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]].'
登入後複製

以上是如何從維基連結中提取資料?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:stackoverflow.com
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!