问题描述
我正在用C#制作网络抓取应用程序。我正在使用HTML Agility Pack解析HTML。我开始怀疑它的功能,因为似乎有些节点无法选择。
这是我要抓取的网站:https://place.map.kakao.com/253560122
<div id='kakaoWrap'>
<div class='kakaoContent'>
<div id='mArticle'>
<div data-viewid='menuInfo'>
<ul class='list_menu'>
<li class='nophoto_type'>
<li class='nophoto_type'>
<li class='nophoto_type'>
...
我正在尝试获取<ul class='list_menu'>
中的列表项。如果我在Google Chrome控制台中使用$x
函数,它将按预期选择三个li元素:
$x("//*[@class='nophoto_type']")
(3) [li.nophoto_type,li.nophoto_type,li.nophoto_type]
0: li.nophoto_type
1: li.nophoto_type
2: li.nophoto_type
length: 3
__proto__: Array(0)
所以我在C#中使用相同的xpath,但是它无法选择任何内容:
var menus = doc.DocumentNode.SelectNodes("//*[@class='nophoto_type']");
我试图通过尝试逐步到达列表来查看错误发生的位置。我发现,它可以选择(div id='kakaoWrap'),but not (div class='kakaoContent')
:
var menus = doc.DocumentNode.SelectSingleNode("//body/div[@id='kakaoWrap']") // Works!;
var menus = doc.DocumentNode.SelectSingleNode("//body/div[@id='kakaoWrap']/div[@class='kakaoContent']") // Returns null!;
我的两个猜测是1.)Html Agility Pack在使用xpath时遇到问题,或者2.)该站点正在积极阻止解析,从警告中猜测:
通过document.write调用阻止解析器的跨站点(即,不同的eTLD + 1)脚本https://t1.daumcdn.net/mapjsapi/js/main/4.2.0/v3.js。由于网络连接不良,在此页面加载或将来的页面加载中,浏览器可能会阻止对此脚本的网络请求。如果在此页面加载中被阻止,则会在随后的控制台消息中进行确认。有关更多详细信息,请参见https://www.chromestatus.com/feature/5718547946799104。
但是我可以选择整个文档以及其中的一些节点,因此我认为它是1.)。我在使用xpaths时总是遇到麻烦,如果我看不到任何东西,如果有人可以放弃他们的智慧,我将不胜感激!
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)