【问题标题】:Using htmlAgilityPack scraping all inner text from <a> tag [closed]使用 htmlAgilityPack 从 <a> 标记中抓取所有内部文本 [关闭]
【发布时间】:2013-02-22 13:51:35
【问题描述】:

我想从链接http://search.freefind.com/siteindex.html?id=59478474&ltr=10240&fwr=0&pid=i&ics=1 中删除所有单词 我尝试过这样的事情:

HtmlWeb web = new HtmlWeb();
HtmlAgilityPack.HtmlDocument doc = web.Load("http://search.freefind.com/siteindex.html?id=59478474&ltr=10240&fwr=0&pid=i&ics=1");
HtmlNodeCollection nodes = doc.DocumentNode.SelectNodes("//font[@class='search-index-font']//a");

if (nodes != null)
{

    foreach (HtmlNode n in nodes)
    {
         link = n.InnerText;
        my_link.Add(link);
        MessageBox.Show(link);
    }

}
else
    MessageBox.Show("no wordfound ");

我的expexted输出应该像

a    
aa
aachhe
aagrashi
aagun
aaj
aam
aanka
aankhi
aar
aashman
abāddhō
abāddhōtā
abadh
..
..

但它不起作用??它显示“找不到单词”意味着它返回 null。在这种情况下,我如何从 标记中获取所有文本??? 谁能告诉我 SelectNodes("") 应该是什么???

【问题讨论】:

  • 发生了什么发生了? “它不起作用”并不是一个有助于解决问题的好描述。
  • 它显示“找不到单词”......
  • 该页面上的标记完全损坏。您正在搜索的块中根本没有打开的a 元素。例如:&lt;/script&gt;a&lt;/a&gt;&lt;br&gt;&lt;script&gt;findindexitem('aa');&lt;/script&gt;aa&lt;/a&gt; - 没有可供 HAP 匹配的 &lt;a&gt;
  • 你不能 - 它是无效的 HTML。您将需要使用其他东西。
  • 我没有答案。您是否了解加载页面时 HTML 无效,除非 JavaScript 运行? HTML 敏捷包无法执行 JavaScript。因此,要么在 JavaScript 运行后获取 HTML 并将其复制到本地 - 然后针对它运行 HAP,要么使用其他方法。

标签: c# .net xpath html-agility-pack web-scraping


【解决方案1】:

您需要在&lt;script&gt; 标记(不是您所说的&lt;a&gt; 标记)之后搜索下一个文本节点,在&lt;font class='search-index-font'&gt; 内。这个 xpath 表达式可以解决问题:

//font[@class='search-index-font']/script/following-sibling::text()[1]

还有这段代码:

HtmlWeb web = new HtmlWeb();
HtmlAgilityPack.HtmlDocument doc = web.Load("http://search.freefind.com/siteindex.html?id=59478474&ltr=10240&fwr=0&pid=i&ics=1");
HtmlNodeCollection nodes = doc.DocumentNode.SelectNodes("//font[@class='search-index-font']/script/following-sibling::text()[1]");

将返回您需要的文本节点:

a
aa
aachhe
aagrashi
aagun
aaj
aam
aanka
aankhi
aar
...

【讨论】:

    【解决方案2】:

    试试这个:

    doc.DocumentNode.SelectNodes("//a[@class='search-index-links']");
    

    而不是

    doc.DocumentNode.SelectNodes("//font[@class='search-index-font']//a");
    

    【讨论】:

    • 它给出了相同的结果。“找不到单词”
    • 我尝试了很多次,但它没有给我任何结果,然后我把它贴在这里。
    • 尝试使用 Selenium 而不是 HTML Agility Pack。 Selenium 将执行脚本,然后您将能够获取数据Selenium web driver
    【解决方案3】:
    HtmlWeb web = new HtmlWeb();
    HtmlAgilityPack.HtmlDocument doc =
        web.Load("http://search.freefind.com/siteindex.html?id=59478474&ltr=10240&fwr=0&pid=i&ics=1");
    HtmlNodeCollection nodes = doc.DocumentNode.SelectNodes("//font[@class='search-index-font']");
    string link = string.Empty;
    if (nodes != null)
    {
        foreach (var item in nodes)
        {
            var value =
            item.Elements("script").ToList();
            foreach (var items in value)
            {
                link += items.NextSibling.InnerText+ "\n";
            }
        }
        MessageBox.Show(link);
    }
    else
        MessageBox.Show("no wordfound ");
    

    【讨论】:

    • 能否解释一下“var value=item.Elements("script").ToList();"这条线??@John
    • 因为字体标签中的元素很多,我只选择脚本标签,如果你要调试代码,你会在手表中看到。
    【解决方案4】:

    你的问题是

    doc.DocumentNode.SelectNodes("//font[@class='search-index-font']//a");
    

    返回null,如记录的here

    这是因为font 元素中没有class 属性等于search-index-font 在您在doc 中加载的html 中的a 元素。


    如果您更改传递给 SelectNodes 的 xpath 以选择存在的内容,那么您的代码将采用不同的路径。在不知道你要达到什么目标的情况下,我无法提供进一步的建议。


    您可以使用 HAP 来解析有效的 html,即使用它来识别脚本元素。然后你必须手动滚动一些东西来解析脚本标签的内部文本来提取你想要的东西。

    最终,您需要的是孟加拉语单词列表。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-05-11
    • 2016-04-06
    • 1970-01-01
    • 2012-04-03
    • 1970-01-01
    • 1970-01-01
    • 2012-11-06
    • 2011-02-16
    相关资源
    最近更新 更多