如何使用java中的regex模式从HTML页面中提取数据

时间:2016-04-05 01:42:56

标签: java html regex

我正在尝试从html页面中提取数据,以便将它们存储在String数组

在HTML页面中,值显示如下

 <tbody>
                      <tr>
                        <td style="width: 14%;">88055</td>
                        <td style="width: 19%;" class="gris">Ville</td>
                        <td style="width: 33%;"><a href="repertoire-des-municipalites/fiche/municipalite/88055/" >Amos</a></td>
                        <td style="width: 34%;"><a href="repertoire-des-municipalites/fiche/mrc/880/" >Abitibi</a></td>
                      </tr>
                      <tr>
                        <td style="width: 14%;">85080</td>
                        <td style="width: 19%;" class="gris">Village</td>
                        <td style="width: 33%;"><a href="repertoire-des-municipalites/fiche/municipalite/85080/" >Angliers</a></td>
                        <td style="width: 34%;"><a href="repertoire-des-municipalites/fiche/mrc/850/" >Témiscamingue</a></td>
                      </tr>
                      <tr>
                        <td style="width: 14%;">87050</td>
                        <td style="width: 19%;" class="gris">Municipalité</td>
                        <td style="width: 33%;"><a href="repertoire-des-municipalites/fiche/municipalite/87050/" >Authier</a></td>
                        <td style="width: 34%;"><a href="repertoire-des-municipalites/fiche/mrc/870/" >Abitibi-Ouest</a></td>
                      </tr>

我只需要提取href = Municipality

的字符串

女巫意味着Amos,Angliers等......并将它们存储到一个字符串数组

到目前为止,我已经尝试了这个,但我已经失去了

  public static final String EXPRESSION = "";//How to write the regex expression?
String [] data = new String [20]
    URL url = new URL("http://myur.com");


 BufferedReader in  = new BufferedReader(new InputStreamReader(url.openStream()));

        while ((ligne = in.readLine()) != null) {
          //What to write here? 
            }
            in.close();

P.S:我知道最好的方法是使用HTML解析器,但我真的被迫采用这种方式

非常感谢,

低音

3 个答案:

答案 0 :(得分:1)

您可以使用类似的内容对具有>的网址进行硬编码匹配,并将文本内的文字转换为< <tbody> <tr> <td style="width: 14%;">88055</td> <td style="width: 19%;" class="gris">Ville</td> <td style="width: 33%;"><a href="repertoire-des-municipalites/fiche/municipalite/88055/" >Amos</a></td> <td style="width: 34%;"><a href="repertoire-des-municipalites/fiche/mrc/880/" >Abitibi</a></td> </tr> <tr> <td style="width: 14%;">85080</td> <td style="width: 19%;" class="gris">Village</td> <td style="width: 33%;"><a href="repertoire-des-municipalites/fiche/municipalite/85080/" >Angliers</a></td> <td style="width: 34%;"><a href="repertoire-des-municipalites/fiche/mrc/850/" >Témiscamingue</a></td> </tr> <tr> <td style="width: 14%;">87050</td> <td style="width: 19%;" class="gris">Municipalité</td> <td style="width: 33%;"><a href="repertoire-des-municipalites/fiche/municipalite/87050/" >Authier</a></td> <td style="width: 34%;"><a href="repertoire-des-municipalites/fiche/mrc/870/" >Abitibi-Ouest</a></td> </tr> 字符。

这是我的数据文件:

import java.util.*;
import java.util.regex.*;
import java.lang.*;
import java.io.*;

class test
{
    public static void main (String[] args) throws java.lang.Exception
    {
        BufferedReader in  = new BufferedReader(new FileReader(new File("data")));
        String line="";
        Pattern p=Pattern.compile("href\\s*=\\s*(?:\"|').*municipalite/[^>]*>(?:<.*>)*([^<]*)<.*$");
        while ((line = in.readLine()) != null)
        {
            Matcher m=p.matcher(line);
            while(m.find())
                System.out.println(m.group(1)); 
        }
        in.close();
    }
}

这是java文件:

$ javac test.java 
$ java test 
Amos
Angliers
Authier
$

输出:

href\\s*=\\s*(?:\"|').*municipalite/[^>]*>(?:<.*>)*([^<]*)<.*$

正则表达式细分:

href\\s*=\\s*
  1. =匹配后跟0或更多空格的href 按(?:\"|')然后按0或更多空格

  2. (?:) - &gt; .*municipalite/表示非捕获组,即匹配 单引号或双引号但不记录/记住

  3. municipalite/匹配任何字符,直到[^>]*>(?:<.*>)*出现

  4. >匹配任何不是>的字符 url然后匹配(?:<.*>),然后尝试匹配0或更多(全部 可选)使用此([^<]*)

  5. 将标记打开到非捕获组
  6. <.*$此群组实际上将您的字符串捕获到第1组

  7. Not Registered与该行的其余部分匹配

答案 1 :(得分:1)

我在python中展示过。但我相信,正则表达式在Java中是相同的。使用Java函数查找匹配项。

import re
reg = r"<a href=.*?municipalite.*?>(.+?)</a>"
result = re.findall(html)

答案 2 :(得分:1)

尝试".*\\bhref=\"repertoire-des-municipalites/fiche/municipalite/\\d+/\"[^>]*>([^<]*)<.*"

我的演示代码(如下)提供了控制台输出:

控制台输出

Amos
Angliers
Authier

演示代码

public class HrefRegex
{
    public static void main(final String[] args)
    {
        final String[] sampleLines = new String[] {
            "  </tr>",
            "    <td style=\"width: 14%;\">88055</td>",
            "    <td style=\"width: 19%;\" class=\"gris\">Ville</td>",
            "    <td style=\"width: 33%;\"><a href=\"repertoire-des-municipalites/fiche/municipalite/88055/\" >Amos</a></td>",
            "    <td style=\"width: 34%;\"><a href=\"repertoire-des-municipalites/fiche/mrc/880/\" >Abitibi</a></td>",
            "  </tr>",
            "  <tr>",
            "    <td style=\"width: 14%;\">85080</td>",
            "    <td style=\"width: 19%;\" class=\"gris\">Village</td>",
            "    <td style=\"width: 33%;\"><a href=\"repertoire-des-municipalites/fiche/municipalite/85080/\" >Angliers</a></td>",
            "    <td style=\"width: 34%;\"><a href=\"repertoire-des-municipalites/fiche/mrc/850/\" >Témiscamingue</a></td>",
            "  </tr>",
            "  <tr>",
            "    <td style=\"width: 14%;\">87050</td>",
            "    <td style=\"width: 19%;\" class=\"gris\">Municipalité</td>",
            "    <td style=\"width: 33%;\"><a href=\"repertoire-des-municipalites/fiche/municipalite/87050/\" >Authier</a></td>",
            "    <td style=\"width: 34%;\"><a href=\"repertoire-des-municipalites/fiche/mrc/870/\" >Abitibi-Ouest</a></td>",
            "  </tr>",
          };


        final Pattern pattern = Pattern.compile(".*\\bhref=\"repertoire-des-municipalites/fiche/municipalite/\\d+/\"[^>]*>([^<]*)<.*");

        for (final String s : sampleLines)
        {
            final Matcher matcher = pattern.matcher(s);

            if (matcher.matches())
            {
                System.out.println(matcher.group(1));
            }
        }
    }
}