0

数据:

<tr>
<td>
<a href="somelink">
some. .data...
</a>
</td>
<td>Black</td>
<td>57234</td>
<td>5431.60</td>
<td><font class="down">  -125.02</font></td>
</tr><tr>
<td>
<a href="somelink">
some. .data...
</a>
</td>
<td>Blue</td>
<td>57234</td>
<td>5431.60</td>
<td><font class="up">  -125.02</font></td>
</tr><tr>
<td>
<a href="somelink">
some. .data...
</a>
</td>
<td>Brown</td>
<td>57234</td>
<td>5431.60</td>
<td><font class="down">  -125.02</font></td>
</tr>
...more data...

我想提取一些。。数据...'; '黑色的'; '57234'; '5431.60'; 一次。[第五个td数据不是必需的。]

最初,

<tr><td><a.*>([a-zA-Z0-9 -]+)</a></td><td>(\w+)</td><td>([\d]+\.\d+)</td><td>(\d+\.\d+)</td>

正在工作。(通过命中和未命中方法)

但是,现在它坏了。

现在,当我使用<td>(.*)</td>or时,它会显示每个 tr 中<\w+>(.*)</\w+>最后四个 s 的数据。td但是,为什么它不会显示<a href...>...</a>,我怎样才能得到我想要的数据?

4

2 回答 2

6

通常,正则表达式是解析 HTML 的不好方法

我建议查看HTML Agility PackCsQuery,它们是专门为 .NET 构建的 HTML 解析器。

HTML Agility Pack 可以使用 XPath 和 LINQ 进行查询,而 CsQuery 使用 jQuery 选择器。

于 2013-01-20T18:37:43.310 回答
1

如果你使用真正的 html 解析器,你的代码会更简单,更容易维护

HtmlAgilityPack.HtmlDocument doc = new HtmlAgilityPack.HtmlDocument();
doc.LoadHtml(html);

var table = doc.DocumentNode.Descendants("tr")
           .Select(tr => tr.Descendants("td").Select(td => td.InnerText).ToList())
           .ToList();

鉴于您提供的示例 html,上面的代码将返回 3 行,每行包含 5 列。

于 2013-01-20T19:08:13.313 回答