想了一个多小时,求个{正则}大神看看如何正则出下面 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)
3931 次点击
所在节点    Python
38 条回复
jin6220
2017-01-14 23:07:37 +08:00
for title in titles:
print(title)
别人上传的代码怎么那么结构清晰啊 =,=
zhjits
2017-01-14 23:09:20 +08:00
直接读 JSON 转成的 dict 不行么
decken
2017-01-14 23:11:52 +08:00
用 json.loads 反序列化出对象,再 get 一下就 ok 了
golmic
2017-01-14 23:12:00 +08:00
url":"[^"]+
privil
2017-01-14 23:12:02 +08:00
@jin6220 别人用 md 格式了呗,楼上正解, json 搞出来的事 dict ,打印字典指定值被
cdwyd
2017-01-14 23:12:13 +08:00
re.compile('article/(\d+)/')
fy
2017-01-14 23:13:38 +08:00
这需求不要用正则,本身例外多早晚出事。直接 json 解轻松愉快。
jin6220
2017-01-14 23:13:55 +08:00
@zhjits 是已经转换成 dict 了 但是现在正则已经弄出一半数据了 。。。
Yinz
2017-01-14 23:18:44 +08:00
如果不要求一定用正则的话, json 直接读成 dict 就好了,如 3 、 5 楼所说

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)

上面这几行改成
j2=json.loads(j)
print(j2.get('title_hide'))
print(j2.get('url'))

应该就没问题的了
Yinz
2017-01-14 23:19:28 +08:00
@jin6220 沉没成本不要算啊,毕竟转 dict 之后简单太多了
jin6220
2017-01-14 23:21:12 +08:00
当初没用字典是嫌麻烦,各种套嵌。看来明天还得再看看正则。
jin6220
2017-01-14 23:23:50 +08:00
======自答下:=========
第一步: a=j2['result'] (这里 j2 就不用字符串话了)
第二部:
>>> for b in a :
print(b.get('title_hide'))


制作一个万花筒,来一场镜花水月的邂逅
让翅膀在指尖上舞动:用铁丝制作在指尖扇动的小机械
来做一个漂亮的鱼标本吧!
低成本打造头戴式立体声蓝牙耳机
自动温调速风扇,让你的电脑更冷静
给你的键盘加上无线 PPT 控制功能吧
给钛挂件镀一层彩色外衣
泥塑入门,做个蒸汽朋克范儿黄金头骨
送妹纸魔方拼图,你也可以
温差发电机:不用电的“智能”风扇
手机?投影机?一个盒子就可兼得!
GEEK 小浪漫:靠在一起就会闪烁的心
制作属于你自己的球形关节人偶
GEEK 厨房之草莓酱,和一坨肉眼可见 DNA
沏一壶苔藓
软木塞变身灰袍甘道夫
自制模具,巧克力形状随便你
情人节,送 Ta 一支彩虹玫瑰!
远程电子点火器,安全烟火必备
化学小实验:居家版“法老之蛇”
>>> for b in a :
print(b.get('url'))


http://www.guokr.com/article/437636/
http://www.guokr.com/article/437297/
http://www.guokr.com/article/437489/
http://www.guokr.com/article/437145/
http://www.guokr.com/article/437064/
http://www.guokr.com/article/437046/
http://www.guokr.com/article/437010/
http://www.guokr.com/article/436762/
http://www.guokr.com/article/436941/
http://www.guokr.com/article/436937/
http://www.guokr.com/article/436912/
http://www.guokr.com/article/436915/
http://www.guokr.com/article/436835/
http://www.guokr.com/article/436799/
http://www.guokr.com/article/436722/
http://www.guokr.com/article/436694/
http://www.guokr.com/article/436679/
http://www.guokr.com/article/436667/
http://www.guokr.com/article/436640/
http://www.guokr.com/article/436644/
>>>
jin6220
2017-01-14 23:28:59 +08:00
@Yinz 嗯 你那个结构好像不对 但是换成 json 无非就是套嵌 dict 循环下就立马解出了 正则不如派森像是人类语言啊啊啊
但是还是很想弄懂正则怎么写 毕竟有时候只有正则解决问题很暴力 =,=
lxy
2017-01-15 00:25:13 +08:00
要是有人在工作中有 json 不用非要用正则写一堆“乱码”会被我捏脸的。 4 楼那个就是了,不过漏了空格,稍微严谨一点的写法:
"url"\s*:\s*"(.+?)"\s*,
Allianzcortex
2017-01-15 00:42:13 +08:00
其实我想说的很多时候返回的 JSON 格式顺序是不固定的,调好了这一个正则,下次请求的时候内容就又变了。所以???
Yinz
2017-01-15 00:42:20 +08:00
@jin6220 这。。。别循环啊,自己分析下 json 的格式然后逐步 get 就好了,没必要循环找元素吧
jin6220
2017-01-15 07:47:28 +08:00
@Yinz 里头的主体结构类似是:
{ "result": [{"title_hide": ...,,"url": ...},{title_hide:...,url:...},{title_hide:...,url:...},,{title_hide:...,url:...},其他字典]}
result 的值是一个列表,列表里的字典都是并列结构,不循环可以?
jin6220
2017-01-15 08:37:50 +08:00
wyntergreg
2017-01-15 08:57:55 +08:00
不用 JSON 非要正则,舍近求远?
allenhu
2017-01-15 09:12:48 +08:00
无知者无畏

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

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

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

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

© 2021 V2EX