使用htmlAgilityPack从<a> tag</a>抓取所有内部文本

时间:2013-02-22 13:51:36

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

我想废弃链接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 ");

我的经历输出应该

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

但它不起作用?它显示“找不到单词”表示它返回null。如何从&lt;中获取所有文本? a&gt;在那种情况下标签???   任何人都可以告诉我SelectNodes应该是什么(“”)???

4 个答案:

答案 0 :(得分:0)

你的问题是

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

返回null,记录为here

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


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


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

最终,你想要的是孟加拉语单词列表。

答案 1 :(得分:0)

试试这个:

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

而不是

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

答案 2 :(得分:0)

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 ");

答案 3 :(得分:0)

您需要在<script><a>标记(不是<font class='search-index-font'>标记后)搜索下一个文本节点。这个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
...