我在这里看到了许多与此相关的问题,但对我来说,这些问题都没有。所以任何可以在这里帮助我的人。 首先,我要从Amazon网站上抓取数据并将数据保存在此DataGridView中
dataGridViewScraping数据:
dataGridViewASIN:
我成功抓取了第一页数据,但是当我尝试抓取第二个数据并将数据放入datagridview时,我得到了错误
索引超出范围。必须为非负且**
当循环第二次返回并且我放入DataGridView的第一个数据是标题时,我在这里也遇到错误:
for (int i = 0; i < dataGridViewASINs.Rows.Count - 1; i++)
{
//Getting Title
string title = driver.FindElement(By.Id("productTitle")).GetAttribute("innerText");
dataGridViewScrapingData.Rows[i].Cells[cols].Value = title;
}
我正在使用此代码将数据放入datagridview中,所有其他列的代码都与我正在使用的
行[index] .Cells [索引]
对于所有列,但对于组合框列,我认为我没有使用此索引,因此也仅适用于第一次迭代
for (int i = 0; i < dataGridViewASINs.Rows.Count - 1; i++)
{
List<IWebElement> imageCounts = driver.FindElements(By.XPath("//ul[@class='a-unordered-list a-nostyle a-button-list a-vertical a-spacing-top-extra-large']//li[@class='a-spacing-small item imageThumbnail a-declarative']//span[@class='a-button-text']//img")).ToList();
element = driver.FindElement(By.Id("landingImage"));
comboState.Items.Add(element.GetAttribute("src"));
for (int j = 0; j < imageCounts.Count - 1; j++)
{
//Clicking that Element
string GenricXpath = "//ul[@class='a-unordered-list a-nostyle a-button-list a-vertical a-spacing-top-extra-large']//li[" + (j + 5).ToString() + "]//span[1]//span[1]//span[1]//input[1]";
element = driver.FindElement(By.XPath(GenricXpath)); element.Click();
//Extracting URL now
string AnotherXpath = "//li[@class='image item itemNo" + (j + 1).ToString() + " maintain-height selected']//img";
element = driver.FindElement(By.XPath(AnotherXpath)); comboState.Items.Add(element.GetAttribute("src"));
}
dataGridViewScrapingData.Columns.Add(comboState);
}
除此之外,在将数据放入datagridviewScrapingData之后,我也想知道。我不知道如何获取DataGridViewScraping数据的combobox列中的全部数据。我想将数据从datagridviewScrapingData获取到字符串列表中,在此我已保存了全部数据。在stackoverflow上,我也看到了许多与此相关的问题,但是对我来说,这些问题都没有。
答案 0 :(得分:0)
看起来您使用dataGridView的方法有点不正确。您尝试直接使用数据网格行,但其想法是要有一个像List<Product>
这样的单独集合,并通过绑定源进行显示。
1。首先创建一个代表您的产品的类,例如:
public class Product
{
public string Title { get; set; }
public string Asin { get; set; }
}
2。创建产品列表并将其刮到该列表。
3。在表单设计器中单击dataGridView,然后注意右上角的箭头按钮。单击它,然后通过选择您的Product
类来生成新的数据源。 DataGridBindingSource将出现在表单设计器的底部。假设它的名称为dataGridViewBindingSource
。
4。将您的产品集合分配给绑定源:
dataGridViewBindingSource.DataSource = products;
现在,您可以通过调用dataGridView.Refresh()
方法来修改产品集合并在网格中显示更新的产品。此时,您应该摆脱“索引超出范围”异常,并且可以引用产品集合,因此不必从数据网格行中显式“提取”它们。
5。不必从ComboBox中获取值,您可以先将选项存储在产品中,然后将其添加到组合框。