html / 网页抓取 C# 特定的文件结构



我更喜欢用 C# 来做这件事,但如果最好的是 R 或 Python,如果需要,我可以通过其中一个推送一个包含结果的文件。 为朋友这样做,所以想在一个易于使用的exe中做所有事情。

我正在寻找从几百个 HTML 文件中拉出一行的最佳方法,它始终是每个 html 文件中的第 23 行。 (如果您打开文件进行编辑(

通过文件进行迭代没什么大不了的,但我正在寻找的是一种只收集 tr class=g 中的第 4 个 TD 的方法,但是文件中有许多相同的 tr 类

<tr class=g><td class=s1>Talent</td><td>Good</td><td>Average</td><td>Poor</td><td>Brilliant</td><td>Good</td><td>Good</td></tr>

在上面的例子中,"辉煌"是我试图找到的,但前提是该职位有"辉煌"一词。

提前谢谢。

有点不清楚你说的第 23 行是什么意思。你的意思是文件中的第 23 行,还是浏览器中的第 23 行?

如果是第一种情况,最简单的方法是简单地加载每个文件并扫描新行。由此,您将能够确定何时到达第 23 行。

但是,如果您想加载 HTML 并能够使用类似 jQuery 的选择器(如tr .g(扫描元素,我会推荐像我的 HTML 解析器 HtmlMonkey 这样的东西。此库将解析 HTML,然后让您轻松搜索元素。它是一个 NuGet 包,但也可在 Git Hub 上使用。

我会使用Nuget Package HtmlAgilityPack。
然后你可以这样做

var html = @"<tr class=g><td class=s1>Talent</td><td>Good</td><td>Average</td><td>Poor</td><td>Brilliant</td><td>Good</td><td>Good</td></tr>";
var doc = new HtmlAgilityPack.HtmlDocument();
doc.LoadHtml(html);
foreach (var tr in doc.DocumentNode.ChildNodes)
{
// loop tds
foreach (var td in tr.ChildNodes)
{
...
}
// or access node directly
var val4 = tr.ChildNodes[3].InnerText;
}

要获取第 23 行,您可以使用

var line23 = File.ReadLines(fileName).Skip(22).FirstOrDefault();

如果你要抓取HTML文本,我还建议通过以下方式使用HtmlAgilityPack。

HtmlDocument doc = new HtmlDocument();
List<string> files = new List<string>(); // Define your list of files
List<string> valuesNeeded = new List<string>(); // These are the values from each doc
foreach(string file in files)
{
doc.LoadHtml(File.ReadAllLines(file).ElementAt(23));
var node = doc.DocumentNode.SelectSingleNode("//tr[@class='g']//td[4]"); // td starts with index 1.
if (node != null) 
valuesNeeded.Add(node.InnerText);
}

过程

  • 在文件列表中读取
  • 循环访问列表并读取每个文件。仅获取第 23 行并将其加载到 HtmlDocument 中
  • 查找具有类名gtr的第一个节点及其第 4 个td元素。
  • 如果它不为 null,请将其添加到结果列表中。

最新更新