我如何在c#中阅读HTML文档,因为我有网页源存储在字符串变量中

本文关键字:网页 存储 变量 字符串 因为 HTML 文档 | 更新日期: 2023-09-27 18:15:47

我试过自己做这件事,但做不到。

我有一个html文档,我试图提取其中所有图片的地址到一个c#集合,我不确定语法。我用的是htmllagilitypack…这是我目前所知道的。请建议。

HTML代码如下:

<div style='padding-left:12px;' id='myWeb123'>
<b>MyWebSite Pics</b>
<br /><br />
<img src="http://myWebSite.com/pics/HHTR_01.jpg" alt='myWebSitePics' title='myWebSitePics' /><br /><br />
<img src="http://myWebSite.com/pics/HHTR_02.jpg" alt='myWebSitePics' title='myWebSitePics' /><br /><br />
<img src="http://myWebSite.com/pics/HHTR_03.jpg" alt='myWebSitePics' title='myWebSitePics' /><br /><br />
<img src="http://myWebSite.com/pics/HHTR_04.jpg" alt='myWebSitePics' title='myWebSitePics' /><br /><br />
<img src="http://myWebSite.com/pics/HHTR_05.jpg" alt='myWebSitePics' title='myWebSitePics' /><br /><br />
<img src="http://myWebSite.com/pics/HHTR_06.jpg" alt='myWebSitePics' title='myWebSitePics' /><br /><br />
<img src="http://myWebSite.com/pics/HHTR_07.jpg" alt='myWebSitePics' title='myWebSitePics' /><br /><br />
<img src="http://myWebSite.com/pics/HHTR_08.jpg" alt='myWebSitePics' title='myWebSitePics' /><br /><br />
<img src="http://myWebSite.com/pics/HHTR_09.jpg" alt='myWebSitePics' title='myWebSitePics' /><br /><br />
<img src="http://myWebSite.com/pics/HHTR_10.jpg" alt='myWebSitePics' title='myWebSitePics' /><br /><br />
<a href="http://www.myWebSite.com/" target="_blank" rel="nofollow">Source</a>
</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文档,但这个包缺乏示例,关于它的方法和类的信息对我来说真的很难理解没有示例。

我如何在c#中阅读HTML文档,因为我有网页源存储在字符串变量中

试试这个,对不起,如果它将无法构建,我已经覆盖了我们的代码您的情况

List<string> result = new List<string>();
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);
}

您可以使用Load的过载,它接受TextReader:

document.Load(new StringReader(text));

(我没有查看其余的代码,但这解决了"如果我已经得到了字符串形式的HTML该怎么办?"部分)

这一行:

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

您选择的是<div>节点,而不是其下的<img>节点。尝试这样选择那些img节点:

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

至于选择语法,它与XML中使用的XPath相同。因此,如果需要选择的示例,请搜索XPath。

在本例中:

  • 前导/从文档的根开始搜索(而不是从某些"当前节点")
  • //意味着下一个匹配可以在任何深度,而不是直接在根
  • 下。
  • div[@id='myWeb123']搜索具有属性'id'值'myWeb123'的<div>节点
  • /img直接在匹配的div节点下搜索img节点。

如果页面大小增加,像这样使用Xpath的代价会很高。最好是将html反序列化为对象。你也不需要使用你正在使用的html参考。使用流阅读器和Xmlserializer加载HTML使用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。