따라서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을 따옴표로 묶어야 합니다.
다음으로, 컬 명령은 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을 미리 지적하고 싶었습니다.예이제 현지인.