-1

我正在尝试访问bgp 排名 url,但正在获取 html 页面作为输出,我想获取该hmtl 页面中的 json 数据。我们如何获取json 数据

这是控制器,下面我给出了服务实现。任何机构都可以找出问题

这是 BGP 排名网址:https ://bgp.he.net

控制器

@RestController
@RequestMapping(value = "/api/bgp")
public class BGPController {

    @Autowired
    BGPService bgpService;

    @RequestMapping(value = "/getInfoById/{query}", method = RequestMethod.POST)
    protected @ResponseBody Map<String, Object> getAllJobs(@PathVariable(value = "query") String query) {
    Map<String, Object> dataMap = new HashMap<String, Object>();
    try {
        dataMap.put("status", true);
        dataMap.put("result", bgpService.getRanking(query));
    } catch (Exception e) {
        dataMap.put("status", false);
        dataMap.put("reason", e.getMessage());
        System.err.println("exception at bgp: ");
        e.printStackTrace();
    }
    System.out.println("dataMap: " + dataMap.toString());
    return dataMap;
    }
}

服务实施

@Service
@Component
public class BGPServiceImpl implements BGPService {

    static CloseableHttpClient httpClient = HttpClients.createDefault();
    HttpGet getRequest = null;
    CloseableHttpResponse response = null;
    BufferedReader br = null;
    String stringJson = null;
    StringEntity stringEntity = null;
    String output = null;

    String URL = "https://bgp.he.net/";

    @Override
    public Map<String, Object> getRanking(String query) {

        Map<String, Object> dataMap = new HashMap<>();
        try {
            getRequest = new HttpGet(URL  + query);
            response = httpClient.execute(getRequest);
            br = new BufferedReader(new InputStreamReader((response.getEntity().getContent())));
            String responseContent = "";
            while ((output = br.readLine()) != null) {
            responseContent += output;
            }
            if (response.getStatusLine().getStatusCode() == 200) {
            dataMap.put("status", "success");
            dataMap.put("rawData", responseContent);
            } else {
            dataMap.put("status", "failure");
            }
        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
            br.close();
            } catch (Exception e) {
            e.printStackTrace();
            }
        }
        System.out.println("dataMap: " + dataMap);
        return dataMap;
    }

}
4

2 回答 2

0

我认为有三个主要步骤。

首先,使用 https 连接请求 html 页面,无论您知道什么工具,例如 httpsurlconnection 类等。

其次,您必须在 html 页面中找到您的关键字,然后使用 jsoup 库对其进行解析。

最后,您可以使用 json 库并轻松获得一个 json 字符串。

例如,在网站的第一页

在搜索html的源代码后,我可以找到一个关键字'tabdata' 。

其余过程顺利。

这是我给你的例子。

首先,我必须跳过这一步,因为您已经有了自己的解决方案。

、一个JSoupParser类,用关键字提取内容

static class JSoupParser {
    public String getWelcomeBGP(final String htmlcontents) {
        StringBuilder stbuld = new StringBuilder();
        Document doc = Jsoup.parseBodyFragment(htmlcontents);

        for (Element div : doc.select("div")) {
            int i = 0; 
            if(div.className().equals("tabdata"))
            {
                for (Element subdiv : div.select("div")) {
                    if(i != 0)
                        if(!subdiv.text().equals(""))
                            stbuld.append(subdiv.text()).append("\n");
                    i++;
                }
            }
        }

        return stbuld.toString();
    }
}

最后,一个 JsonParser 类从内容中生成一个 json 字符串。

static class JsonParser {
    public JSONObject getWelcomeBGP(final String contents) throws IOException {
        BufferedReader breader = new BufferedReader(new StringReader(contents));
        String line= null;
        JSONObject jobj = new JSONObject();
        int id = 0;
        while((line = breader.readLine()) != null)
        {
            jobj.put("A" + id++, line);
        }

        return jobj;
    }

}

这是我的主要方法。

import org.json.JSONObject;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;

public static void main(String[] args) {
    // first, request html contents from the site.
    HttpsClientWithoutValidation htmlContents = new HttpsClientWithoutValidation();
    final String url = "https://bgp.he.net";
    String response = htmlContents.requestHtmlContents(url);

    // second, request html contents from the site.
    JSoupParser htmlparser = new JSoupParser();
    String contents = htmlparser.getWelcomeBGP(response);

    // finally, make your own json string or object whatever.
    JSONObject jobj = null;
    JsonParser jsonparser = new JsonParser();
    try {
        jobj = jsonparser.getWelcomeBGP(contents);
        System.out.println(jobj.toString());
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}

祝你有美好的一天。

于 2019-02-08T08:32:17.263 回答
0

但是我正在获取 html 页面作为输出,我想在那个 hmtl 页面中获取 json 数据

您需要解析 HTML Jsoup 将是有用的库。然后您必须创建自己的 JSON。

但是,该网站上的搜索框似乎没有返回任何结果,所以我不确定您的代码是否可以在没有额外努力的情况下正常工作,例如使用Selenium

首先使用终端而不是浏览器来测试您的查询。

$ curl -sL 'https://bgp.he.net/query'

<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>403 Forbidden</title>
</head><body>
<h1>Forbidden</h1>
<p>You don't have permission to access /query
on this server.</p>
<hr>
<address>Apache/2.4.7 (Ubuntu) Server at bgp.he.net Port 443</address>
</body></html>
于 2019-02-08T06:13:55.503 回答