【问题标题】:How to extract contents of <tr> tags from html document using regex?如何使用正则表达式从 html 文档中提取 <tr> 标签的内容?
【发布时间】:2015-12-30 16:19:53
【问题描述】:

我有一份文件,其中包含有关每个国家/地区的数据。每个表格行都是一个国家/地区:

<tr>
    <td class="td-flag"><a href="/afghanistan"><img alt="Flag of Afghanistan"  src="//flags.fmcdn.net/data/flags/mini/af.png" width="30" height="20" /></a></td>
    <td class="td-country"><a href="/afghanistan">Afghanistan</a></td>
    <td class="td-capital">Kabul</td>
    <td class="td-population">25,500,100</td>
    <td class="td-area">652,090&nbsp;km<sup>2</sup></td>
</tr>

我尝试提取:链接到国旗、国家名称、captiol 和人口,但首先我需要分别插入Vector 中的每个表格行,所以我需要提取每个&lt;tr&gt;content&lt;/tr&gt; 的内容。

问题:如何提取html文档中每个&lt;tr&gt;的内容?我根本没有匹配项:

try {
            BufferedReader br = new BufferedReader(new FileReader("./data/countries.txt"));
            StringBuilder sb = new StringBuilder();
            String line;
            while ((line = br.readLine()) != null) {
                sb.append(line + '\n');
            }
            br.close();

            ArrayList<String> tableRows = new ArrayList<String>();
            Pattern p = Pattern.compile(" <tr>(\\w+)</tr> ", Pattern.MULTILINE);
            Matcher m = p.matcher(sb);
            while (m.find()) {
                System.out.println("match");//it never prints thus there are no matches
                tableRows.add(m.group());
            }
            System.out.println(tableRows.size());//THE SIZE is 0
            for (String tr : tableRows) {
                System.out.println(tr);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }

【问题讨论】:

  • 我建议尝试使用 jsoup 进行解析。
  • 正确的答案是使用现有的解析库,但更重要的是,模式周围的空格可能会破坏您的特定代码。
  • 同样" &lt;tr&gt;(\w+)&lt;/tr&gt; "只能匹配(space)&lt;tr&gt;oneWord&lt;/tr&gt;(space)
  • @Pshemo 我后来添加了空格,删除后仍然没有找到内容。

标签: java html regex


【解决方案1】:

有更简单的方法可以从 HTML 文件中提取数据,特别是:

Regex 也有效,但比上述技术更容易出错。

++ 编辑 ++

  • XPath 示例

我必须承认,XPath 对我来说相当新,所以下面的代码并不是最优化的,但它会让您快速了解它是如何工作的。您可以在浏览器的控制台中练习使用 XPath。打开您的 HTML 页面并使用 $x(EXPRESSION); 包装您的表达式。

$x("//tr/td[@class='td-flag']/a/@href") 将呈现:Array [ href="/afghanistan" ]

  • jQuery 示例

如果您以前从未使用过 jQuery,您也可以在浏览器的控制台中使用它。它几乎是一个 JavaScript 库,其唯一目的是简化代码。

$(".td-flag a").href 将渲染"file:///afghanistan"

我在上面的代码 sn-p 中只使用了一个 tr 元素,但显然你有更多的 tr 元素,所以上面的表达式返回数组。此外,在您的表格元素上放置一个 ID 标签,以便轻松安全地访问;-)

【讨论】:

    【解决方案2】:

    除了 JQuery 答案之外,还有 JSoup,它允许您在 Java 中执行 JQuery 样式的查询:

    Document doc = Jsoup.connect("<your url here>").get();
    Elements rows = doc.select("tr");
    for(Element row : rows){
        String country = row.getElementByClass("td-country").text();
        // etc.
    }
    

    【讨论】:

      【解决方案3】:

      如果这类数据在线,我的意思是如果您的文档在线,我建议您甚至可以使用 import.io 等工具来创建特定于您的用例的 API。

      响应是 JSON 格式,使用 jQuery 很容易处理。

      当我必须在网络上处理表格数据时,我更喜欢使用 import.io,而不是基于 DOM 元素创建某种解析器。

      您始终可以使用 jQuery 并以 JSON 格式保存所有数据,您需要创建一个 javascript 解析器,以便它解析文档其余部分的数据,然后添加此信息,然后提取您收集的此信息JSON,因此您可以在任何地方使用它。

      // defining variables
      var flag = $('td.td-flag img').prop('src');
      var country = $('td.td-country a').html();
      var capital = $('td.td-capital').html();
      var population = $('td.td-population').html();
      var area = $('td.td-area').html();
      

      现在这只是解析器的一部分,它只提取一行数据的数据,如果您有多行数据,您将需要运行一个 foreach(每个在 javascript 中)循环,循环遍历所有表元素并将它们全部读取(使用上面定义的变量)...最后将它们作为数组或导出为 JSON 格式。

      【讨论】:

        猜你喜欢
        • 2018-05-08
        • 1970-01-01
        • 1970-01-01
        • 2014-06-16
        • 2014-04-11
        • 2010-09-26
        • 1970-01-01
        • 2011-04-07
        相关资源
        最近更新 更多