为了账号安全,请及时绑定邮箱和手机立即绑定

在 Java 中使用 Scanner 进行网页抓取

在 Java 中使用 Scanner 进行网页抓取

HUH函数 2022-06-30 18:02:14
我应该使用 URL 和扫描程序类进行网络抓取,并从网站上的 HTML 代码中仅找出过去 8 天的能源消耗量。所以我有一个 24x8 的数组来适应所有的数字。我正在使用 .findInLine 来识别小时前:我在这里使用第一个部分来识别第一个小时的数字块。while (in.findInLine("00-01") == null) in.nextLine();in.nextLine() // skip rest of the line containing "00-01"<td>00-01</td><td align="right"> 11872</td><td align="right"> 12146</td><td align="right"> 12861</td><td align="right"> 12561</td><td align="right"> 13493</td><td align="right"> 13386</td><td align="right"> 12732</td><td align="right"> <b>12249</b></td>我的问题是我不知道如何提取这些数字并将它们放入数组中,因为我有 24 个这些部分。
查看完整描述

2 回答

?
皈依舞

TA贡献1851条经验 获得超3个赞

给定输入,以下将提取每行的数字。


  Pattern pattern = Pattern.compile("\\d+");

    while (in.hasNext())

    {

      String str = in.nextLine();

      Matcher m = pattern.matcher(str);

      while (m.find())

      {

        //Change this to add to add to an array

        System.out.println(m.group());           


      }

    }


查看完整回答
反对 回复 2022-06-30
?
慕哥6287543

TA贡献1831条经验 获得超10个赞

鉴于您的输入有限,我仅使用纯扫描仪界面就做到了:


public class Scrap {


private final static String HOUR_PATTERN = "<td>\\d{2}-\\d{2}</td>";

private final static String TD_DELIMETER = "\\s|<|>";


public static void main(String[] args) {

    Scanner in = new Scanner(Scrap.class.getResourceAsStream("/input"));

    List<Integer> res = new ArrayList<>();

    while (in.hasNext()) {

        if (!in.hasNext(HOUR_PATTERN)) {

            System.out.println(in.next());

            continue;

        }

        String found = in.next(HOUR_PATTERN);

        Pattern delim = in.delimiter();

        in.useDelimiter(TD_DELIMETER);

        for (int i = 0; i < 8; i++) {// you wrote it is going to be 8 entries

            while (in.hasNext()) {

                if (in.hasNextInt()) {

                    res.add(in.nextInt());

                } else {

                    System.out.println(in.next());

                }

            }

        }

        in.useDelimiter(delim);

    }

    System.out.println(res);

}

}

给定输入


blelblebll


<td>00-01</td>

<td align="right"> 11872</td>

<td align="right"> 12146</td>

<td align="right"> 12861</td>

<td align="right"> 12561</td>

<td align="right"> 13493</td>

<td align="right"> 13386</td>

<td align="right"> 12732</td>

<td align="right"> <b>12249</b></td>


<td>00-01</td>

<td align="right"> 11872</td>

<td align="right"> 12146</td>

<td align="right"> 12861</td>

<td align="right"> 12561</td>

<td align="right"> 13493</td>

<td align="right"> 13386</td>

<td align="right"> 12732</td>

<td align="right"> <b>12249</b></td>



<td>00-01</td>

<td align="right"> 11872</td>

<td align="right"> 12146</td>

<td align="right"> 12861</td>

<td align="right"> 12561</td>

<td align="right"> 13493</td>

<td align="right"> 13386</td>

<td align="right"> 12732</td>

<td align="right"> <b>12249</b></td>



<td>00-01</td>

<td align="right"> 11872</td>

<td align="right"> 12146</td>

<td align="right"> 12861</td>

<td align="right"> 12561</td>

<td align="right"> 13493</td>

<td align="right"> 13386</td>

<td align="right"> 12732</td>

<td align="right"> <b>12249</b></td>

生产


[11872, 12146, 12861, 12561, 13493, 13386, 12732, 12249, 11872, 12146, 12861, 12561, 13493, 13386, 12732, 12249, 11872, 12146, 12861, 12561, 13493, 13386, 12732, 12249, 11872, 12146, 12861, 12561, 13493, 13386, 12732, 12249]

它基于您的输入示例,因此它现在可能适用于实时标记。


或者,您可以将<.*?>其用作分隔符并仅关注数字模式。


查看完整回答
反对 回复 2022-06-30
  • 2 回答
  • 0 关注
  • 156 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号