当找到多个结果时,我的 C# WPF webscraper returns 错误

My C# WPF webscraper returns error when more than one result is found

我正在开发一个 WPF XAML 应用程序,用于抓取某些网站的产品。我的搜索部分在工作,它找到了我要找的东西。但是只要有超过 1 个结果,我就会得到 System.InvalidoperationException。我使用 ObservableCollection 将结果放入 <ListBox>.

搜索方法如下:

private static ObservableCollection<EntryModel> _entries = new ObservableCollection<EntryModel>();

public static ObservableCollection<EntryModel> LoadCollectionData
{
    get { return _entries; }
    set { _entries = value; }
}

public static void PrehmSearchResults(string SearchQuery)
{
    HtmlWeb web = new HtmlWeb();

    try
    {
        string ZoekOpdracht = SearchQuery.Replace(" ", "+");
        HtmlDocument doc = web.Load("https://www.prehmshop.de/advanced_search_result.php?keywords=" + ZoekOpdracht);

        var title = doc.DocumentNode.CssSelect("div.header_cell > a").Single().InnerText;

        var links = doc.DocumentNode.CssSelect("a.product_link");
        var productLink = new List<string>();
        var productTitle = new List<string>();

        foreach (var item in links)
        {
            if (item.Attributes["href"].Value.Contains(".html"))
            {
                productLink.Add(item.Attributes["href"].Value);
                productTitle.Add(title);
            }
        }

        var TitleAndLink = productLink.Zip(productTitle, (l, t) => new { productLink = l, productTitle = t });
        
        foreach (var nw in TitleAndLink)
        {
            var product = new List<EntryModel>();
            var adDetails = new EntryModel
            {
                Title = nw.productTitle,
                Link = nw.productLink
            };

            Debug.Print(adDetails.ToString());
            var ZoekOpdrachtInTitle = adDetails.Title.ToLower().Contains(ZoekOpdracht.ToLower());
            
            if (ZoekOpdrachtInTitle)
            {
                _entries.Add(adDetails);
            }
        }
    }

所以我找到了解决方案而没有更改太多代码。感谢@PaulSinnema 的帮助。

link 是标题的一部分所以我只需要更改

var title = doc.DocumentNode.CssSelect("div.header_cell > a").ToList();

而且我不得不更改 foreach 循环:

foreach (var item in title)
{
    if (item.Attributes["href"].Value.Contains(".html"))
        {
            productLink.Add(item.Attributes["href"].Value);
            productTitle.Add(item.InnerText);
        }
}