英文:
Wants to populate dictionary with data from website, but I fail on adding them
问题
我正在尝试创建一个方法,以从密码保护的网页上获取数据。我使用了Selenium Web Driver来成功连接到网站并登录,但我想将数据存储到我创建的字典中。
// 自定义参数
public class Params_Rezervation
{
public string Time { get; set; }
public string Guests { get; set; }
public string Name { get; set; }
public string Email { get; set; }
public string Status { get; set; }
public string Text { get; set; }
public string Table { get, set; }
}
这是我想在我的字典中拥有的自定义参数,以便我可以访问它们。我尝试创建这个字典。
```csharp
public static Dictionary<int, Params_Rezervation> rezervace_data = new Dictionary<int, Params_Rezervation>();
然后,我尝试从网站中填充它,但在将数据添加到字典时失败。
public static void LoadReservation()
{
// 设置Chrome参数
var chromeOptions = new ChromeOptions();
chromeOptions.AddArguments("--headless");
// 隐藏控制台
var chromeDriverService = ChromeDriverService.CreateDefaultService();
chromeDriverService.HideCommandPromptWindow = true;
try
{
using (var browser = new ChromeDriver(chromeDriverService, chromeOptions))
{
// 设置网站
browser.Navigate().GoToUrl("specific website");
// 输入密码 + 提交
browser.FindElement(By.Id("pwbox-580")).SendKeys("password");
browser.FindElement(By.Name("Submit")).Click();
// 查找特定表格
IWebElement tableElement = browser.FindElement(By.XPath("//*[@id=\"post-580\"]/div/div[2]/table"));
// 查找行
IList<IWebElement> rows = tableElement.FindElements(By.XPath(".//tr"));
// 数据
int number = 0;
foreach (IWebElement row in rows)
{
// 查找特定列
IList<IWebElement> columns = row.FindElements(By.XPath(".//th"));
// 错误行,我不知道如何继续
rezervace_data.Add(number, new Params_Rezervation());
// 数据填充
rezervace_data[number].Time = columns[0].Text;
rezervace_data[number].Guests = columns[1].Text;
rezervace_data[number].Name = columns[2].Text;
rezervace_data[number].Email = columns[3].Text;
rezervace_data[number].Text = columns[4].Text;
rezervace_data[number].Table = columns[5].Text;
number++;
}
}
}
catch (Exception ex)
{
MessageBox.Show("加载数据时发生错误!\n" + ex, "错误", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
}
我得到的错误:
System.NullReferenceException:“对象引用未设置为对象的实例。”
System.Collections.Generic.Dictionary<TKey, TValue>.this[TKey].get返回null。
我正在尝试学习编程,所以如果有人告诉我需要更改什么,将非常有帮助,因为我是通过自学和网站学习的。
英文:
I am trying to make method where I could scrap data from webpage that's behind password locked form. I used Selenium Web Driver to successfully connect to website and login there, but I would like to store the data do Dicitonary that I made.
// Custom params
public class Params_Rezervation
{
public string Time { get; set; }
public string Guests { get; set; }
public string Name { get; set; }
public string Email { get; set; }
public string Status { get; set; }
public string Text { get; set; }
public string Table { get; set; }
}
This is the custom params I would like to have in my dicitonary so I could access them. I tried to make this dictionary.
public static Dictionary<int, Params_Rezervace> rezervace_data = new Dictionary<int, Params_Rezervace>();
Then I tried it populate it with data from website, but I fail on adding data to dictionary.
public static void LoadReservation()
{
// Setting up a
var chromeOptions = new ChromeOptions();
chromeOptions.AddArguments("--headless");
// Console hiding
var chromeDriverService = ChromeDriverService.CreateDefaultService();
chromeDriverService.HideCommandPromptWindow = true;
try
{
using (var browser = new ChromeDriver(chromeDriverService, chromeOptions))
{
// Setting up a website
browser.Navigate().GoToUrl("specific website");
// Entering password + submiting it
browser.FindElement(By.Id("pwbox-580")).SendKeys("password");
browser.FindElement(By.Name("Submit")).Click();
// Finding the specific table
IWebElement tableElement = browser.FindElement(By.XPath("//*[@id=\"post-580\"]/div/div[2]/table"));
// Finding the row
IList<IWebElement> rows = tableElement.FindElements(By.XPath(".//tr"));
// Data
int number = 0;
foreach (IWebElement row in rows)
{
// Finding specific columns
IList<IWebElement> columns = row.FindElements(By.XPath(".//th"));
//The error line where I dont know how to continue
rezervace_data.Add(number, Params_Rezervace);
// Data populating
rezervace_data[number].Time = columns[0].Text;
rezervace_data[number].Guests = columns[1].Text;
rezervace_data[number].Name = columns[2].Text;
rezervace_data[number].Email = columns[3].Text;
rezervace_data[number].Text = columns[4].Text;
rezervace_data[number].Table = columns[5].Text;
number++;
}
}
}
catch (Exception ex)
{
MessageBox.Show("Error while loading data! \n" + ex, "Error", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
Error I get:
System.NullReferenceException: 'The object reference is not set to an instance of the object.'
System.Collections.Generic.Dictionary<TKey, TValue>.this[TKey].get returned null.
I trying to learn programming so If someone will answer me what to change it will be very helpfull, because I am learning it by myself and websites
答案1
得分: 0
你的“错误行”应该是这样的:
rezervace_data.Add(number, new Params_Rezervace());
你需要在类型为 Params_Rezervace 的字典中添加一个对象,而你可以使用 new 关键词来实现这个操作。
英文:
Your “error line” should be something like this:
rezervace_data.Add(number, new Params_Rezervace());
You need to add an object in your dictionary of type Params_Rezervace, and the way you do that is with the new keyword.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论