0

たとえば、次の HTML 文字列を解析しているとします。

<html>
    <head>
        RANDOM JAVASCRIPT AND CSS AHHHHHH!!!!!!!!
    </head>
    <body>
        <table class="table">
            <tr><a href="/subdir/members/Name">Name</a></tr>
            <tr><a href="/subdir/members/Name">Name</a></tr>
            <tr><a href="/subdir/members/Name">Name</a></tr>
            <tr><a href="/subdir/members/Name">Name</a></tr>
            <tr><a href="/subdir/members/Name">Name</a></tr>
            <tr><a href="/subdir/members/Name">Name</a></tr>
            <tr><a href="/subdir/members/Name">Name</a></tr>
            <tr><a href="/subdir/members/Name">Name</a></tr>
            <tr><a href="/subdir/members/Name">Name</a></tr>
            <tr><a href="/subdir/members/Name">Name</a></tr>
        </table>
    <body>
</html>

**の内容を分離したい(テーブルクラス内のすべて)

さて、これを達成するために正規表現を使用しました:

string pagesource = (method that extracts the html source and stores it into a string);
string[] splitSource = Regex.Split(pagesource, "<table class=/"member/">;
string memberList = Regex.Split(splitSource[1], "</table>");
//the list of table members will be in memberList[0];
//method to extract links from the table
ExtractLinks(memberList[0]);

この抽出を行う他の方法を調べていたところ、C# の Match オブジェクトに出会いました。

私はこのようなことをしようとしています:

Match match = Regex.Match(pageSource, "<table class=\"members\">(.|\n)*?</table>");

上記の目的は、うまくいけば2つの区切り文字間の一致値を抽出することでしたが、実行しようとすると一致値は次のようになります。

match.value = </table>

私の質問は、次のとおりです。正規表現を使用した方法よりも少し簡単/読みやすい/短い文字列からデータを抽出する方法はありますか? この単純な例では、正規表現は問題ありませんが、より複雑な例では、画面全体に落書きに相当するコーディングが表示されます。

非常にきちんとした整頓されたクラスのように見えるので、私は本当にマッチを使いたいと思っていますが、私のニーズに合わせて動作させることができないようです. 誰でもこれで私を助けることができますか?

どうもありがとうございました!

4

3 に答える 3

3

HTML Agility Packなどの HTML パーサーを使用します。

var doc = new HtmlDocument();

using (var wc = new WebClient())
using (var stream = wc.OpenRead(url))
{
    doc.Load(stream);
}

var table = doc.DocumentElement.Element("html").Element("body").Element("table");
string tableHtml = table.OuterHtml;
于 2012-06-13T13:13:11.803 に答える
0

HTmlAgilityPack で XPath を使用できます。

HtmlAgilityPack.HtmlDocument doc = new HtmlAgilityPack.HtmlDocument();
doc.LoadHtml(s);
var elements = doc.DocumentNode.SelectNodes("//table[@class='table']");

foreach (var ele in elements)
{
    MessageBox.Show(ele.OuterHtml);
}
于 2012-06-13T13:19:49.717 に答える
0

一致をキャプチャするために、正規表現に括弧を追加しました。

Match match = Regex.Match(pageSource, "<table class=\"members\">(.|\n*?)</table>");

とにかく、正規表現を使用して HTML を正しく解析できるのは Chuck Norris だけのようです。

于 2012-06-13T13:20:59.460 に答える