想了一个多小时,求个{正则}大神看看如何正则出下面 json 里的数据。

2017-01-14 23:02:10 +08:00
 jin6220
每次正则都有从头看一遍,
想了一个多小时了。
就把标题给正则出了
还有标题下下面的网址求问如何弄出来?
"title_hide": "给你的键盘加上无线 PPT 控制功能吧",
"date_modified": "2013-05-24T11:23:42.260648+08:00",
"url": "http://www.guokr.com/article/437046/",
"title": "给你的键盘加上无线 PPT 控制功能吧",
"small_image": "http://2.im.guokr.com/BFnIhI2uKOFbTt44KurAN3zMyaJjXmao9OciN4ayjkLgAQAASQEAAEpQ.jpg",
"summary": "这个项目也是一个很好的焊接技巧入门练习。",
"ukey_author": "m4tq2j",
"date_created": "2013-05-24T11:19:42.252645+08:00",
"resource_url": "http://apis.guokr.com/minisite/article/437046.json"
上面代码是 json 一角,需要的部分是 title_hide ,这个已解出,另一个部分是下下行的 url.


这是我写的代码:

import requests
import re
import json
from bs4 import BeautifulSoup
headers={'User-Agent':'Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.116 Safari/537.36'}
def gker(url):
html=requests.get(url, headers=headers).text
return html

j=gker('http://www.guokr.com/apis/minisite/article.jsonretrieve_type=by_subject&subject_key=diy&limit=20&offset=18&_=1484373021355')
j2=str(json.loads(j)) #必须转换成字符串才能正则匹配。

titles=re.findall(r"(?<='title_hide':).*?(?=,)",j2,re.M)
print(len(titles))
for title in titles:
print(title)

urls=re.findall(r"'url':(.*?),.?'title'",j2,re.M) #这里不对,不知道如何弄出来了
print(len(urls),urls)
3827 次点击
所在节点    Python
38 条回复
jin6220
2017-01-15 09:21:32 +08:00
@allenhu 我是新手,不过也不从事程序猿专业,接触的数据应该都会很简单。
jin6220
2017-01-15 09:40:06 +08:00
正则前后关系匹配:"url"\s*:\s*"(.+?)"\,\s*"title re.M
但是实际 url 的邻居可能会变.
jin6220
2017-01-15 09:46:28 +08:00
吃饭去了。。。
总结下
非正则的办法:
第一步: a=j2['result'] (这里 j2 就不用字符串话了)
a 是一个列表,里面是 20 个并联关系的字典。
第二部:
>>> for b in a :
print(b.get('title_hide'))
>>> for b in a :
print(b.get('url'))

正则方法:
第一种
urls=re.findall(r"(?<='url':)\s*'http://www.guokr.com/article/\d{5,7}/'(?=,)",str(j2))
第二种(看运气,前后邻居可能会变,然后就失效)
urlsre=re.findall(r"'url'\s*:\s*'(.+?)',\s*'title'",str(j2),re.M)
Valyrian
2017-01-15 09:56:11 +08:00
这是理论上行不通的,因为 regex parse 的是 regular language , json isn't a regular language
http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags
aheadlead
2017-01-15 10:05:40 +08:00
@lxy 捏脸好评
jin6220
2017-01-15 10:22:22 +08:00
@Valyrian 理论是不行,第一次也是发现不对,然后就把 json ( dict )数据 str 化了,最后是找到结果了。
sola97
2017-01-15 10:31:31 +08:00
这么简单还不用 dict...有写正则的功夫早就 get 完了
Merlini
2017-01-15 11:09:14 +08:00
而且正则也慢啊
zzn
2017-01-15 11:56:46 +08:00
解析 xml/json 不要用正则
解析 xml/json 不要用正则
解析 xml/json 不要用正则
zhidian
2017-01-15 12:00:07 +08:00
JSON 也有 xpath 类似的工具啊……
jin6220
2017-01-15 12:04:03 +08:00
@zzn 那用什么啊 对这块不太懂 这个 json 没显示汉字,变成字典显示之后然后正则的
imlonghao
2017-01-15 12:34:34 +08:00
import requests

a = requests.get('http://www.guokr.com/apis/minisite/article.json?retrieve_type=by_subject&subject_key=diy&limit=20&offset=18&_=1484373021355').json()

result = [[x['title_hide'], x['url']] for x in a['result']]
imlonghao
2017-01-15 12:35:48 +08:00
不!要!用!正!则!处!理 json 数!据!
jin6220
2017-01-15 13:20:15 +08:00
@imlonghao 嗯 这个列表表达式用的好 学习了 比 for 循环简洁,但是没 for 循环好理解。
eoo
2017-01-15 23:14:55 +08:00
PHP json_decode($json); 搞定 啊哈哈
Ouyangan
2017-01-16 00:09:52 +08:00
正则处理 json 属于野路子.本身就是结构化的数据为什么用正则呢?
xiamx
2017-01-16 01:35:48 +08:00
@jin6220 楼主看看 @Valyrian 给的链接。 JSON 是 Context-free grammar ,不是 regular language 所以不能用正则解析(当然,某些子集还是属于 regular language 的)
jin6220
2017-01-16 08:55:39 +08:00
@xiamx 好吧 谢谢,有个疑问,那个网站的 json 数据转换为字典之后(因为里头的汉字没显示出来。),然后 str 字符串化,这样正则可以吗?

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/334647

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX