したがって、JSON-HTML Webページ次のパターンで行のみをフィルタリングしたいと思います。
"realname": "SOME_VALUE_COMES_HERE",
私はこれを試しました:
curl https://www.mediawiki.org/w/api.php?action=query&meta=siteinfo&siprop=specialpagealiases&formatversion=2 -s |
grep -oP '"realname": "[A-Za-z0-9]*",' |
sort -u > special_page_names.txt
ファイルが作成されましたが空です。私はコマンドで何を間違っていますかgrep -oP
?
修正する
私はそれを使用せずにjq
インストールできますが、「すべての基本」アプローチを好む。
答え1
ウェブサイトでは、format=json
次のオプションを提供していますjq
。
curl 'https://www.mediawiki.org/w/api.php?action=query&meta=siteinfo&siprop=specialpagealiases&formatversion=2&format=json' \
| jq -r '.query | .specialpagealiases[].realname'
答え2
まず、シェルがプロセスをバックグラウンドに置くコマンドで "&"を解釈しないように、URLを引用符で囲む必要があります。
次に、curlコマンドはJSONを返しません。印刷時にJSONの外観を表すHTMLを返します。しかし、上部にはこれを使って&format=json
実際のJSONを得ることができます。
次に、JSONのインポートに使用すると&format=json
印刷がうまくいかないため、「:」の後のスペースを削除する必要があります。
curl 'https://www.mediawiki.org/w/api.php?action=query&meta=siteinfo&siprop=specialpagealiases&format=json' -s | grep -oP '"realname":"[A-Za-z0-9]*",' | sort -u > special_page_names.txt
"realname":
結果の周囲の引用符と末尾のコンマを削除するには、次のようにします。
curl 'https://www.mediawiki.org/w/api.php?action=query&meta=siteinfo&siprop=specialpagealiases&format=json' -s | grep -oP '"realname":"[A-Za-z0-9]*",' | sed -E 's/"realname":"([A-Za-z0-9]*)",/\1/' | sort -u > special_page_names.txt
これは迅速で汚れた方法でのみ使用してください。強力なものが必要な場合は、実際のJSONパーサーを使用するか、少なくともjq
。
答え3
Pythonはここで最も簡単な解決策です。
スクリプト
import sys
import requests
url = sys.argv[1]
response = requests.get(url)
if response:
if not response.ok:
print('Bad response: {0!r}'.format(response))
sys.exit(1)
else:
data = response.json()
query = data.get("query", None)
if query:
special_page_aliases = query.get("specialpagealiases", None)
if special_page_aliases:
for spa in special_page_aliases:
real_name = spa.get("realname", None)
if real_name:
print(spa.get("realname"))
sys.exit(0)
print('Bad request')
sys.exit(1)
使用法
python script.py "https://www.mediawiki.org/w/api.php?action=query&meta=siteinfo&siprop=specialpagealiases&format=json"
このスクリプトは、「query.specialpagealiases」キーの下のすべての「realname」値をコンソールにダンプします。
編集する:OPがローカルソリューションを探していることを知っています。私はPythonをあらかじめ指摘したいと思いました。はい今地元の人。