在一行中查找所有URL

时间:2019-04-24 13:59:33

标签: python python-3.x

我正在尝试获取一个页面,该页面的纯文本内容(例如,

"link_url":"http://www.example.com/link1?site=web","mobile_link_url":"http://m.example.com/episode/link1?site=web" link_url":"http://www.example.com/link2?site=web","mobile_link_url":"http://m.example.com/episode/link2?site=web"

我累了

import re
import requests as req

response = req.get("http://api.example.com/?callback=jQuery112")

content = response.text

打印内容会给我“ link_url”:输出 但我需要找到

http://www.example.com/link1?site=web
http://www.example.com/link2?site=web

,仅将link1和link2输出到

这样的文件
link1
link2
link3

5 个答案:

答案 0 :(得分:1)

如果它是一个字符串而不是一个JSON对象,那么即使它有点hacky,您也可以这样做:

s1 ="\"link_url\":\"http://www.example.com/link1?site=web\",\"mobile_link_url\":\"http://m.example.com/episode/link1?site=web\" link_url\":\"http://www.example.com/link2?site=web\",\"mobile_link_url\":\"http://m.example.com/episode/link2?site=web\""

links = [x for x in s1.replace("\":\"", "LINK_DELIM").replace("\"", "").replace(" ", ",").split(",")]

for link in links:
    print(link.split("LINK_DELIM")[1])

哪种产量:

http://www.example.com/link1?site=web
http://m.example.com/episode/link1?site=web
http://www.example.com/link2?site=web
http://m.example.com/episode/link2?site=web

尽管我认为@al76的答案对此较为优雅。

但是如果它是一个类似于以下内容的JSON

[
  {
    "link_url": "http://www.example.com/link1?site=web",
    "mobile_link_url": "http://m.example.com/episode/link1?site=web"
  },
  {
    "link_url": "http://www.example.com/link2?site=web",
    "mobile_link_url": "http://m.example.com/episode/link2?site=web"
  }
]

然后您可以执行以下操作:

import json
s1 = "[{ \"link_url \": \"http://www.example.com/link1?site=web \", \"mobile_link_url \": \"http://m.example.com/episode/link1?site=web \"}, { \"link_url \": \"http://www.example.com/link2?site=web \", \"mobile_link_url \": \"http://m.example.com/episode/link2?site=web \"} ]"
data = json.loads(s1)
links = [y for x in data for y in x.values()]

for link in links:
    print(link)

答案 1 :(得分:1)

下面的代码可能就是您所需要的。

import re

urls = '''"link_url":"http://www.example.com/link1?site=web","mobile_link_url":"http://m.example.com/episode/link1?site=web" link_url":"http://www.example.com/link2?site=web","mobile_link_url":"http://m.example.com/episode/link2?site=web"'''

links = re.findall(r'http://www[a-z/.?=:]+(link\d)+', urls)
print(links)

答案 2 :(得分:1)

如果这是JSON API,那么您可以使用response.json()来获取python字典,因为.text会将响应作为一个长字符串提供给您。

您也不需要使用正则表达式进行简单的操作,python附带了URL解析器。

因此,只要您的答复是类似的

[
  {
    "link_url": "http://www.example.com/link1?site=web",
    "mobile_link_url": "http://m.example.com/episode/link1?site=web"
  },
  {
    "link_url": "http://www.example.com/link2?site=web",
    "mobile_link_url": "http://m.example.com/episode/link2?site=web"
  }
]

(只要IRL是有效的JSON,IRL是否是一行都无所谓)

您可以将结果作为字典进行迭代,然后使用urlparse获取url的特定组成部分:

from urllib.parse import urlparse
import requests


response = requests.get("http://api.example.com/?callback=jQuery112")

for urls in response.json():
    print(urlparse(url["link_url"]).path.rsplit('/', 1)[-1])

urlparse(...).path仅返回您网址的路径,例如。 episode/link1,然后我们用rsplit得到它的最后一段,就得到link1link2等。

答案 3 :(得分:0)

尝试

urls=""" "link_url":"http://www.example.com/link1?site=web","mobile_link_url":"http://m.example.com/episode/link1?site=web" link_url":"http://www.example.com/link2?site=web","mobile_link_url":"http://m.example.com/episode/link2?site=web" """
re.findall(r'"http://www[^"]+"',urls)

答案 4 :(得分:0)

urls=""" "link_url":"http://www.example.com/link1?site=web","mobile_link_url":"http://m.example.com/episode/link1?site=web" link_url":"http://www.example.com/link2?site=web","mobile_link_url":"http://m.example.com/episode/link2?site=web" """

p = [i.split('":')[1] for i in urls.replace(' ', ",").split(",")[1:-1]]


#### Output  ####
['"http://www.example.com/link1?site=web"',
 '"http://m.example.com/episode/link1?site=web"',
 '"http://www.example.com/link2?site=web"',
 '"http://m.example.com/episode/link2?site=web"']

*不如正则表达式有效。