2013-02-22 90 views
0

我想从http://search.freefind.com/siteindex.html?id=59478474&ltr=10240&fwr=0&pid=i&ics=1 我想是这样的链接取消所有的字:使用htmlAgilityPack刮除<a>标签的所有内部文本

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。如何从< a>标签获得所有文本? 谁能告诉我什么应该在SelectNodes(“”)?

+2

_did_发生什么? “它不起作用”不是一个有助于解决问题的很好的描述。 – Oded 2013-02-22 13:53:03

+0

它显示“没有发现任何词”.... – DarkenShooter 2013-02-22 13:56:46

+2

该页面上的标记完全被打破。在你正在搜索的块中没有开放的'a'元素。例如:' a
aa' - 没有用于HAP匹配的''。 – Oded 2013-02-22 13:57:36

回答

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 
... 
0

你的问题是

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

回报null,如记录here

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


如果你改变你传递给SelectNodes选择的东西存在,那么你的代码将采取不同的路径中的XPath。不知道你要实现什么,我不能进一步建议。


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

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

+0

我明白了吗?但在那种情况下,我该如何解决这个问题,并得到我想要的结果??你有任何解决?@ Jodrell – DarkenShooter 2013-02-22 14:20:52

+0

@ user2029069,你究竟想要做什么? – Jodrell 2013-02-22 14:25:43

0

尝试这样的:

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

代替

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

它给出了相同的结果。“找不到词” – DarkenShooter 2013-02-22 14:32:32

+0

我已经尝试了很多次,但它没有给我任何结果,然后我发布在这里。 – DarkenShooter 2013-02-22 14:34:14

+0

尝试使用Selenium而不是HTML Agility Pack。 Selenium将执行脚本,然后您将能够获取数据 [Selenium web driver](http://docs.seleniumhq.org/docs/03_webdriver.jsp) – Programmer 2013-02-22 15:24:25

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

您能否解释一下“var value = item”。元素( “脚本”)ToList();”。这行// @约翰 – DarkenShooter 2013-02-22 14:52:25

+0

原因在字体标记中有很多元素,我只选择脚本标记,如果你要调试代码,你会看到在手表中。 – 2013-02-22 15:00:44

相关问题