#c# #nested #html-agility-pack
#c# #вложенные #html-agility-pack
Вопрос:
У меня возникли проблемы с созданием некоторых циклов.
Я использую agilitypack. У меня есть текстовый файл с несколькими ссылками (по 1 на строку), и для каждой ссылки, по которой txt хочет перейти на страницу, а затем позже извлечь, чтобы быть в xpath и записать в заметку.
Проблема, с которой я столкнулся, и в том, что код выполняет процедуру только для последней строки txt. Где я не прав?
var Webget = new HtmlWeb();
foreach (string line in File.ReadLines("c:\test.txt"))
{
var doc = Webget.Load(line);
foreach (HtmlNode node in doc.DocumentNode.SelectNodes("//*[@id='title-article']"))
{
memoEdit1.Text = node.ChildNodes[0].InnerHtml "rn";
break;
}
}
Комментарии:
1. Зачем использовать вложенный цикл, если вы используете
break
в нем..
Ответ №1:
попробуйте изменить
memoEdit1.Text = node.ChildNodes[0].InnerHtml "rn";
Для
memoEdit1.Text = node.ChildNodes[0].InnerHtml "rn";
Комментарии:
1. Спасибо, это сработало, не обратил внимания на эту деталь правильно.
2. @KawyllainyVi Добро пожаловать, рад помочь : D
Ответ №2:
Вы каждый раз перезаписываете memoEdit1.Text
. Попробуйте
memoEdit1.Text = node.ChildNodes[0].InnerHtml "rn";
вместо этого — обратите внимание на =
вместо =
, который каждый раз добавляет новый текст.
Кстати, постоянное добавление строк друг к другу на самом деле не лучший способ. Что-то вроде этого могло бы быть лучше:
var Webget = new HtmlWeb();
var builder = new StringBuilder();
foreach (string line in File.ReadLines("c:\test.txt"))
{
var doc = Webget.Load(line);
foreach (HtmlNode node in doc.DocumentNode.SelectNodes("//*[@id='title-article']"))
{
builder.AppendFormat("{0}rn", node.ChildNodes[0].InnerHtml);
break;
}
}
memoEdit1.Text = builder.ToString();
Или, используя LINQ:
var Webget = new HtmlWeb();
memoEdit1.Text = string.Join(
"rn",
File.ReadAllLines("c:\test.txt")
.Select (line => Webget.Load(line).DocumentNode.SelectNodes("//*[@id='title-article']").First().ChildNodes[0].InnerHtml));
Ответ №3:
Если вы выбираете только 1 узел во внутреннем цикле, тогда используйте SelectSingleNode
вместо этого. Также лучшей практикой при объединении строк в цикле является использование StringBuilder
:
StringBuilder builder = new StringBuilder();
var Webget = new HtmlWeb();
foreach (string line in File.ReadLines("c:\test.txt"))
{
var doc = Webget.Load(line);
builder.AppendLine(doc.DocumentNode.SelectSingleNode("//*[@id='title-article']").InnerHtml);
}
memoEdit1.Text = builder.ToString();
При использовании linq это будет выглядеть следующим образом:
var Webget = new HtmlWeb();
var result = File.ReadLines("c:\test.txt")
.Select(line => Webget.Load(line).DocumentNode.SelectSingleNode("//*[@id='title-article']").InnerHtml));
memoEdit1.Text = string.Join(Environment.NewLine, result);