正则表达式匹配 HTML 中的 JSON

正则表达式匹配 HTML 中的 JSON

由此JSON-HTML 网页我只想过滤掉具有以下模式的行:

"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 放在引号中,这样 shell 就不会将“&”解释为将进程置于后台的命令。

接下来,curl 命令不会返回 JSON。它返回 HTML,该 HTML 表示 JSON 打印后的样子。但它在顶部表示您可以使用它&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现在是本地人。

相关内容