刮伤某些部位的令人敬畏的网

awesomium web scraping certain parts

本文关键字:些部      更新时间:2023-09-26

我之前问过这个问题,但我想重新表述这个问题。我正试图为我的项目制作一台刮刀。我想让它显示链接的某个部分。链接中唯一更改的部分是数字。这个数字是我想要的。链接如下:

<a href="/link/player.jsp?user=966354" target="_parent" "="">

如前所述,我试图只废弃链接的966354部分。我试过几种方法来做这件事,但都想不通。当我添加时

 <a href="/link/player.jsp?user="         

对于下面的代码,它破坏了

 List<string> player = new List<string>();
 string html = webControl2.ExecuteJavascriptWithResult("document.getElementsByTagName('a')[0].innerHTML");
 MatchCollection m1 = Regex.Matches(html, "<a href=''s*(.+?)''s*</a>", RegexOptions.Singleline);
 foreach (Match m in m1)
 {
    string players = m.Groups[1].Value;
    player.Add(players);
 }
    listBox.DataSource = player;

所以我删除了它,它显示没有错误,直到我去运行程序,然后我得到了这个错误:

"在Awesomium.Windows.Forms.dll中发生类型为System.InvalidOperationException的未处理异常"

所以我尝试了这个和它的一些工作:

string html = webControl2.ExecuteJavascriptWithResult("document.getElementsByTagName('html')[0].innerHTML");    

这段代码很零碎,但不是我想要的方式,有人能伸出援手吗。

我会使用HtmlAgilityPack(通过NuGet安装)和XPath查询来解析HTML。

类似这样的东西:

string html = webControl2.ExecuteJavascriptWithResult("document.getElementsByTagName('html')[0].innerHTML");
var htmlDoc = new HtmlAgilityPack.HtmlDocument();
htmlDoc.LoadHtml(html);
var playerIds = new List<string>();
var playerNodes = htmlDoc.DocumentNode.SelectNodes("//a[contains(@href, '/link/profile-view.jsp?user=')]");
if (playerNodes != null)
{
    foreach (var playerNode in playerNodes)
    {
        string href = playerNode.Attributes["href"].Value;
        var parts = href.Split(new char[] { '=' }, StringSplitOptions.RemoveEmptyEntries);
        if (parts.Length > 1)
        {
            playerIds.Add(parts[1]);
        }
    }
    id.DataSource = playerIds;
}

此外,您可能会发现这两个简单的帮助程序类非常有用:https://gist.github.com/AlexP11223/8286153

第一种是WebView/WebControl的扩展方法,第二种是一些静态方法,通过XPath+获取JSObject的坐标来生成用于检索元素(JSObject)的JS代码

使用下面这样的示例html文件,我无法复制异常。

<html>
<a href="/link/player.jsp?user=966354" target="_parent" "="">test</a>
</html>

然而,javascript

document.getElementsByTagName('a')[0].innerHTML

将在我的示例中返回"test"。你可能想要的是

 document.getElementsByTagName('a')[0].href

这将返回href部分。

"innerHTML"属性将返回开始标记和结束标记之间的所有内容(如<html></html>)。这可能是您在获取"html"元素时获得更好成功的原因——您最终解析了整个<a> <a> 链接。

仅供参考,作为测试,您可以使用浏览器来测试javascript输出。