どのようにC#でHTML文書を読むのですか?文字列変数にWebページのソースが格納されていますか?

私は自分でこれをやろうとしましたが、できませんでした。

私はHTML文書を持っており、その中のすべての画像のアドレスをC#のコレクションに抽出しようとしています。構文についてはわかりません。私はHTMLAgilityPackを使用しています...これまで私が持っていたものです。お知らせ下さい。

HTMLコードは次のとおりです:

<div style='padding-left:12px;' id='myWeb123'>
MyWebSite Pics


myWebSitePics

myWebSitePics

myWebSitePics

myWebSitePics

myWebSitePics

myWebSitePics

myWebSitePics

myWebSitePics

myWebSitePics

myWebSitePics

Source </div>

そして、C#コードは次のとおりです:

HtmlAgilityPack.HtmlDocument document = new HtmlAgilityPack.HtmlDocument();

document.Load("FileName.html");

// Targets a specific node
HtmlNode someNode = document.GetElementbyId("myWeb123");

//HtmlNodeCollection linkNodes = document.DocumentNode.SelectNodes("//a[@href]");

HtmlNodeCollection linkNodes = document.DocumentNode.SelectNodes("//div[@id='myWeb123']");

if (linkNodes != null)
{
    int count = 0;
    foreach(HtmlNode linkNode in linkNodes)
    {

        string linkTitle = linkNode.GetAttributeValue("src", string.Empty);

        Debug.Print("linkTitle = " + linkTitle);

        if (linkTitle == string.Empty)
        {
            HtmlNode imageNode = linkNode.SelectSingleNode("img[@alt]");
            if (imageNode != null)
            {
                Debug.Print("imageNode = " + imageNode.Attributes.ToString());
            }
        }
        count++;
        Debug.Print("count = " + count);
    }
}

私はHtmlAgilityPackドキュメンテーションを使用しようとしましたが、このパックには例がなく、メソッドやクラスに関する情報は例がなくても分かりません。

2
それをシリアル化することは可能ですか?
追加された 著者 lloydom,

4 答え

これを試してください。申し訳ありませんがビルド可能でない場合は、私はあなたの状況に私たちのコードを上書きしました

List result = new List();
foreach (HtmlNode link in document.DocumentNode.SelectNodes("//img[@src]"))
{
    HtmlAttribute att = link.Attributes["src"];

    string temp = att.Value;
    string urlValue;
    do
    {
        urlValue = temp;
        temp = HttpUtility.UrlDecode(HttpUtility.HtmlDecode(urlValue));
    } while (temp != urlValue);

    result.Add(temp);
}
3
追加された
うわー、ありがとうございました... IT WORKED :)
追加された 著者 cSharpDotNetGuy,

TextReader をとる Load のオーバーロードを使用することができます:

document.Load(new StringReader(text));

(私はコードの残りの部分を見ていないが、すでにHTMLを文字列に入れているとすれば何をするのだろうか?)

2
追加された
@cSharpDotNetGuy:私は知らない、私は恐れている。私はその過負荷を見つけるためにソースを閲覧しました。
追加された 著者 Jon Skeet,
ありがとうジョン。私は、何をする必要があるかを一歩一歩進んで探していました。誰も助けてくれてありがとう、それは働いた..とにかく、あなたはHtmlAgilityPackの使い方の例をどこで得ることができるのか知っていますか?
追加された 著者 cSharpDotNetGuy,

この行には:

HtmlNodeCollection linkNodes = document.DocumentNode.SelectNodes("//div[@id='myWeb123']");

you are selecting the <div> node, not the nodes under it. Try this to select those img nodes:

HtmlNodeCollection linkNodes = document.DocumentNode
     .SelectNodes("//div[@id='myWeb123']/img");

As for the selection syntax, it's identical to XPath as used in XML. So search for XPath if you want examples of the selection.

In this case:

  • the leading / starts searching from the root of the document (instead of from some "currect node")
  • the // means that the next match can be at any depth instead of directly under the root
  • div[@id='myWeb123'] searches for a <div> node with an attribute 'id' that has value 'myWeb123'
  • the /img searches for an img node directly under the matched div node.
0
追加された

このようにXpathを使うと、ページサイズが大きくなると高価になります。 htmlをオブジェクトに逆シリアル化するのがベストです。また、使用しているHtmlagilityリファレンスを使用する必要はありません。 streamreaderを使用してHTMLを読み込み、Xmlserializerを使用します。 XSDツールを使用してください。最初にxsdに変換してから、xsdツールからクラスを生成します。

1)
C:\Program Files\Microsoft Visual Studio 9.0\VC>xsd /c /language:CS c:\xtest.xml

Microsoft (R) xml Schemas/DataTypes support utility
[Microsoft (R) .NET Framework, Version 2.0.50727.3038]
Copyright (C) Microsoft Corporation. All rights reserved.
Writing file 'C:\Program Files\Microsoft Visual Studio 9.0\VC\xtest.xsd'.

2)
C:\Program Files\Microsoft Visual Studio 9.0\VC>xsd /c  xtest.xsd
Microsoft (R) xml Schemas/DataTypes support utility
[Microsoft (R) .NET Framework, Version 2.0.50727.3038]
Copyright (C) Microsoft Corporation. All rights reserved.
Writing file 'C:\Program Files\Microsoft Visual Studio 9.0\VC\xtest.cs'.

このクラスをソリューションにインポートする

html col = new html();
StreamReader reader = new StreamReader("c:\\test.html"); 
XmlSerializer ser = new XmlSerializer(typeof(html));
col = (html)ser.Deserialize(reader); 

colオブジェクトはimgタグのすべてのsrcをワンショットで保持します。

0
追加された