75629


[![エラー内容です](https://i.stack.imgur.com/WuSs7.png)](https://i.stack.imgur.com/WuSs7.png)NHKの各都道府県のコロナ人数が出ているページからタグを取り出して、大阪と東京の感染者数を表示させたいです。  
実行しても、catchの方にはいかず、結果は出力されません。どの部分を変更すればよろしいでしょうか。`:h3`
を表示させるように記述していますが、取ってきたいのは`text`タグの大阪、`1262`です。

[code]

    <div id="js-slideimage-right01" class="c-slideimage map-test">
      <figure class="js-write-svg">
        <svg class="cls-bg" version="1.1" id="レイヤー_1" ...>
    
          <!-- 中略 -->
    
          <g id="グループ_1">
            <g id="グループ_2">
    
              <!-- 中略 -->
    
              <g id="近畿">
    
                <!-- 中略 -->
    
                <a href="/news/special/coronavirus/data/pref/osaka.html">
                  <g data-js-id="大阪府" id="osaka">
                    <path data-js-state="" id="path-osaka" class="js-hover cls-yellow" d="M831.6,815.6H717.2v213.6h114.4L831.6,815.6L831.6,815.6z" style="opacity: 1;"></path>
                    <text id="osaka-2" transform="matrix(1 0 0 1 774.3998 913.7736)" class="st1 st2" text-anchor="middle">大阪</text>
                    <text data-name="num" transform="matrix(1 0 0 1 774.4001 957.7736)" class="new-infected-val st1 cls-font--s" text-anchor="middle">1262</text>
                  </g>
                </a>
    
[/code]

[code]

    package useful_function;
    
    import java.io.IOException;
    
    import org.jsoup.Jsoup;
    import org.jsoup.nodes.Document;
    import org.jsoup.nodes.Element;
    import org.jsoup.select.Elements;
    public class Open {
        public void openURLConnection() {
    
            try {
                // jsoupを使用してトップページへアクセス
                Document doc = Jsoup.connect("https://www3.nhk.or.jp/news/special/coronavirus/data/").get();
    
                Elements elements = doc.select("h3");
    
                for (Element element : elements) {
                    System.out.println(element.text());
                }
    
            } catch (IOException e) {
                e.printStackTrace();
            }
    
            //      Runtime r = Runtime.getRuntime();
            //      try {
            //          r.exec("");
            //      } catch (IOException e) {
            //          System.out.println("開けません");
            //      }
        }
    }
    
[/code]


CC BY-SA 4.0
2021-05-02T05:35:49.320
75626
2021-05-02T12:24:38.787
2021-05-02T12:24:38.787
41769
41769
question
java web-scraping
jsoupでのWebサイトの値取得について


  * <https://www3.nhk.or.jp/news/special/coronavirus/data/>

のページソースを表示(Google Chromeでは `Ctrl`+`U`)してみるとわかりますが、取得したコードはそのような形式になっていません。  
(Webブラウザに表示されているのは、ページ内のJavaScriptによって加工された結果です。)  
従って、jsoupでは意図した加工を行えません。

* * *

ただし、取得したい情報自体は、そのページのJavaScriptが利用している下記エンドポイントのどちらかから取得できます

  * <https://www3.nhk.or.jp/news/special/coronavirus/data/47newpatients-data.json>
  * <https://www3.nhk.or.jp/news/special/coronavirus/data/latest-pref-data.json>

ので、例えば [`jackson-databind`](https://github.com/FasterXML/jackson-
databind#3-minute-tutorial-generic-collections-tree-model)
を利用して次のような実装で取得可能です。

[code]

    import com.fasterxml.jackson.core.JsonParseException;
    import com.fasterxml.jackson.databind.JsonNode;
    import com.fasterxml.jackson.databind.ObjectMapper;
    import java.io.IOException;
    import java.net.MalformedURLException;
    import java.net.URL;
    import java.util.Objects;
    import java.util.stream.StreamSupport;
    
    public class App {
    
        public static void main(final String[] args) throws JsonParseException, MalformedURLException, IOException {
            final URL url = new URL("https://www3.nhk.or.jp/news/special/coronavirus/data/latest-pref-data.json");
            final ObjectMapper mapper = new ObjectMapper();
    
            final JsonNode tree = mapper.readTree(url);
    
            final JsonNode data47 = tree.get("data47");
    
            // 全県出力
            for (final JsonNode pref : data47) {
                System.out.println(pref.get("name") + ": " + pref.get("new"));
            }
    
            // 大阪府を抽出
            System.out.println();
            final int count = StreamSupport.stream(data47.spliterator(), false)
                .filter(e -> Objects.equals(e.get("name").asText(), "大阪府"))
                .findFirst()
                .map(e -> e.get("new").asInt())
                .get();
    
            System.out.println("大阪府: " + count);
        }
    }
    
[/code]


CC BY-SA 4.0
2021-05-02T08:02:21.437
75629
2021-05-02T08:17:57.397
2021-05-02T08:17:57.397
2808
2808
75626
answer