c# - HtmlAgilityPack NullReferenceException 错误
问题描述
我正在尝试获取文本,但总是收到 NullReferenceException 错误。我快疯了。它工作了一会儿,但我又开始遇到这个错误。我只会得到帖子的标题。
我试图改变我的 XPath。我尝试了不同的 XPath。
private void button1_Click(object sender, EventArgs e)
{
listView1.Items.Clear();
for (int i = 4; i < 9; i++)
{
VeriAl(Url: "https://cracked.to/Forum-Combolists?sortby=started&order=desc&datecut=9999&prefix=0", XPath: "//table[@class='tborder clear']//tr[" + i + "]//td[2]//div[1]//span[1]//span[1]//a", tag: "title",CikanSonuc: listView1);
}
}
public void VeriAl (String Url, String XPath, String tag,ListView CikanSonuc)
{
try
{
url = new Uri(Url);
}
catch (UriFormatException)
{
if (MessageBox.Show(text: "UriFormatException", caption: "Hata", buttons: MessageBoxButtons.OK, icon: MessageBoxIcon.Error) == DialogResult.OK)
{
}
}
catch (ArgumentNullException)
{
if (MessageBox.Show(text: "ArgumentNullException", caption: "Hata", buttons: MessageBoxButtons.OK, icon: MessageBoxIcon.Error) == DialogResult.OK)
{
}
}
WebClient client = new WebClient();
try
{
html = client.DownloadString(url);
}
catch (WebException)
{
if (MessageBox.Show(text: "WebException", caption: "Hata", buttons: MessageBoxButtons.OK, icon: MessageBoxIcon.Error) == DialogResult.OK)
{
}
}
HtmlAgilityPack.HtmlDocument doc = new HtmlAgilityPack.HtmlDocument();
doc.LoadHtml(html);
try
{
CikanSonuc.Items.Add(doc.DocumentNode.SelectSingleNode(XPath).Attributes[tag].Value);
}
catch (NullReferenceException)
{
if (MessageBox.Show(text: "NullReferenceException", caption: "Hata", buttons: MessageBoxButtons.OK, icon: MessageBoxIcon.Error) == DialogResult.OK)
{
}
}
解决方案
问题是在您尝试获取 HTML 时内容不存在。如果您调用WebClient.DownloadString()
. 获得完全加载的网页的唯一方法是使用 WebBrowser 控件加载页面并在加载完成后获取所有内容:
public static class WebViewExtension
{
public static HtmlAgilityPack.HtmlDocument GetHtmlDocument(this WebBrowser wView)
{
HtmlAgilityPack.HtmlDocument doc = new HtmlAgilityPack.HtmlDocument();
doc.LoadHtml(wView.Document.Body.OuterHtml);
return doc;
}
public static async Task<HtmlAgilityPack.HtmlDocument> LoadSiteAndGetHtml(this WebBrowser wView, string siteurl)
{
await wView.NavigateAndWait(siteurl);
HtmlAgilityPack.HtmlDocument doc = wView.GetHtmlDocument();
return doc;
}
public static async Task NavigateAndWait(this WebBrowser wView, string siteurl)
{
TaskCompletionSource<bool> loaded = new TaskCompletionSource<bool>();
wView.Navigate(new Uri(siteurl));
wView.DocumentCompleted += delegate (object sender, WebBrowserDocumentCompletedEventArgs args)
{
loaded?.TrySetResult(true);
};
//wait until the website is loaded
await loaded.Task;
}
}
您可以像这样使用这些方法:
WebBrowser client = new WebBrowser();
try
{
HtmlDocument doc = await client.LoadSiteAndGetHtml(url);
}
catch (WebException)
{
if (MessageBox.Show(text: "WebException", caption: "Hata", buttons: MessageBoxButtons.OK, icon: MessageBoxIcon.Error) == DialogResult.OK)
{
}
}
推荐阅读
- python - 使用 matplotlib 在地图图片上绘制轨迹
- firebase - firebase 会话 cookie 和存储规则
- c# - C# 替换前导撇号 Excel COM
- ruby - 仅将对象 ID 或整个对象传递给方法
- python - Using both leaf and stem images for plant disease detection using convolution neural network?
- json - 如何将空 JSON 值设置为 JMeter 变量
- javascript - 带有 sql 的 EventSources 在 Fullcalendar 中不起作用
- java - 在 Java 控制台中显示分隔数据
- swift - 如何在 Swift 中找到运算符定义?
- android - 如果它们之间有一个活动,我想通过意图发送选定的数据