gpt4 book ai didi

c# - 使用 HTML Agility Pack 只获取网页的文本?

转载 作者:行者123 更新时间:2023-11-30 21:35:28 24 4
gpt4 key购买 nike

我正在尝试抓取网页以仅获取文本。我将每个单词放入字典并计算每个单词在页面上出现的次数。我正尝试按照这篇文章的建议使用 HTML Agility Pack:How to get number of words on a web page?

HtmlWeb web = new HtmlWeb();
HtmlDocument doc = web.Load(url);
int wordCount = 0;
Dictionary<string, int> dict = new Dictionary<string, int>();

foreach (HtmlNode node in doc.DocumentNode.SelectNodes("//text()"))
{
MatchCollection matches = Regex.Matches(node.InnerText, @"\b(?:[a-z]{2,}|[ai])\b", RegexOptions.IgnoreCase);
foreach (Match s in matches)
{
//Add the entry to the dictionary
}
}

但是,在我当前的实现中,我仍然从不应计算在内的标记中获得大量结果。它很接近,但还不完全(我不希望它是完美的)。

我正在使用 this page举个例子。我的结果显示了很多词“width”和“googletag”的使用,尽管它们根本不在页面的实际文本中。

关于如何解决这个问题有什么建议吗?谢谢!

最佳答案

您无法确定您正在搜索的词是否显示给用户,因为 JS 执行和 CSS 规则会影响它。

以下程序确实为 “width” 和“googletag”找到了 0 个匹配项,但找到了 126 个“html”匹配项,而 Chrome Ctrl+F 找到 106 个匹配项。

请注意,如果程序的父节点是<script>,则该程序不会匹配该词。 .

using HtmlAgilityPack;
using System;

namespace WordCounter
{
class Program
{
private static readonly Uri Uri = new Uri("https://www.w3schools.com/html/html_editors.asp");

static void Main(string[] args)
{
var doc = new HtmlWeb().Load(Uri);
var nodes = doc.DocumentNode.SelectSingleNode("//body").DescendantsAndSelf();
var word = Console.ReadLine().ToLower();
while (word != "exit")
{
var count = 0;
foreach (var node in nodes)
{
if (node.NodeType == HtmlNodeType.Text && node.ParentNode.Name != "script" && node.InnerText.ToLower().Contains(word))
{
count++;
}
}

Console.WriteLine($"{word} is displayed {count} times.");
word = Console.ReadLine().ToLower();
}
}
}
}

关于c# - 使用 HTML Agility Pack 只获取网页的文本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49215602/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com