![](/img/trans.png)
[英]How can I read specific data from given html document in Data Table in c#?
[英]How do I read HTML Document in C# given that I have the webpage source stored in a string variable?
我已經嘗試過自己做,但是不能。
我有一個html文檔,並且嘗試將其中所有圖片的地址提取到ac#集合中,但不確定語法。 我正在使用HTMLAgilityPack ...這是到目前為止的內容。 請指教。
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文檔,但是此包缺少示例,如果沒有示例,我很難理解有關其方法和類的信息。
試試這個,對不起,如果它無法構建,我已經根據您的情況覆蓋了我們的代碼
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);
}
您可以使用需要TextReader
的Load
重載:
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。
在這種情況下:
/
從文檔的根目錄開始搜索(而不是從某些“ curect節點”開始搜索) //
表示下一個匹配項可以位於任意深度,而不是直接位於根目錄下 div[@id='myWeb123']
搜索具有值'myWeb123'的屬性'id'的<div>
節點 /img
在匹配的div節點下直接搜索img節點。 如果頁面大小增加,使用這樣的Xpath將會很昂貴。 最好是將html反序列化為對象。 您也不需要使用正在使用的Htmlagility參考。 使用streamreader和使用Xmlserializer使用XSD工具加載HTML,首先將其轉換為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。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.