Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用HtmlAgilityPack_C#_Html Agility Pack - Fatal编程技术网

C# 使用HtmlAgilityPack

C# 使用HtmlAgilityPack,c#,html-agility-pack,C#,Html Agility Pack,我试图从HTML页面获取一个链接和另一个元素,但我真的不知道该怎么做。这就是我现在拥有的: var client = new HtmlWeb(); // Initialize HtmlAgilityPack's functions. var url = "http://p.thedgtl.net/index.php?tag=-1&title={0}&author=&o=u&od=d&page=-1&"; // The site/page we ar

我试图从HTML页面获取一个链接和另一个元素,但我真的不知道该怎么做。这就是我现在拥有的:

var client = new HtmlWeb(); // Initialize HtmlAgilityPack's functions.
var url = "http://p.thedgtl.net/index.php?tag=-1&title={0}&author=&o=u&od=d&page=-1&"; // The site/page we are indexing.
var doc = client.Load(string.Format(url, textBox1.Text)); // Index the whole DB.
var nodes = doc.DocumentNode.SelectNodes("//a[@href]"); // Get every url.

string authorName = "";
string fileName = "";
string fileNameWithExt;

foreach (HtmlNode link in nodes)
{
    string completeUrl = link.Attributes["href"].Value; // The complete plugin download url.

    #region Get all jars

    if (completeUrl.Contains(".jar")) // Check if the url contains .jar
    {
        fileNameWithExt = completeUrl.Substring(completeUrl.LastIndexOf('/') + 1); // Get the filename with extension.
        fileName = fileNameWithExt.Remove(fileNameWithExt.LastIndexOf('.')); ; // Get the filename without extension.
        Console.WriteLine(fileName);
    }

    #endregion

    #region Get all Authors

    if (completeUrl.Contains("?author=")) // Check if the url contains .jar
    {
        authorName = completeUrl.Substring(completeUrl.LastIndexOf('=') + 1); // Get the filename with extension.
        Console.WriteLine(authorName);
    }

    #endregion
}
我试图让所有的文件名和作者彼此相邻,但现在一切都像是随机放置的,为什么


有人能帮我吗?谢谢

如果您查看HTML,很遗憾它的格式不正确。有很多打开的标签,HAP的结构不像浏览器,它将文档的大部分解释为深度嵌套。因此,您不能像在浏览器中那样简单地遍历表中的行,它会变得更加复杂

在处理此类文档时,您必须对查询进行大量更改。与搜索子元素不同,您必须搜索调整更改的子元素

var title = System.Web.HttpUtility.UrlEncode(textBox1.Text);
var url = String.Format("http://p.thedgtl.net/index.php?title={0}", title);

var web = new HtmlWeb();
var doc = web.Load(url);

// select the rows in the table
var xpath = "//div[@class='content']/div[@class='pluginList']/table[2]";
var table = doc.DocumentNode.SelectSingleNode(xpath);

// unfortunately the `tr` tags are not closed so HAP interprets
// this table having a single row with multiple descendant `tr`s
var rows = table.Descendants("tr")
    .Skip(1); // skip header row

var query =
    from row in rows
    // there may be a row with an embedded ad
    where row.SelectSingleNode("td/script") == null
    // each row has 6 columns so we need to grab the next 6 descendants
    let columns = row.Descendants("td").Take(6).ToList()
    let titleText = columns[1].Elements("a").Select(a => a.InnerText).FirstOrDefault()
    let authorText = columns[2].Elements("a").Select(a => a.InnerText).FirstOrDefault()
    let downloadLink = columns[5].Elements("a").Select(a => a.GetAttributeValue("href", null)).FirstOrDefault()
    select new
    {
        Title = titleText ?? "",
        Author = authorText ?? "",
        FileName = Path.GetFileName(downloadLink ?? ""),
    };
因此,现在您可以迭代查询并写出每一行所需的内容

foreach (var item in query)
{
    Console.WriteLine("{0} ({1})", item.FileName, item.Author);
}

如果你看一下HTML,很遗憾它的格式不是很好。有很多打开的标签,HAP的结构不像浏览器,它将文档的大部分解释为深度嵌套。因此,您不能像在浏览器中那样简单地遍历表中的行,它会变得更加复杂

在处理此类文档时,您必须对查询进行大量更改。与搜索子元素不同,您必须搜索调整更改的子元素

var title = System.Web.HttpUtility.UrlEncode(textBox1.Text);
var url = String.Format("http://p.thedgtl.net/index.php?title={0}", title);

var web = new HtmlWeb();
var doc = web.Load(url);

// select the rows in the table
var xpath = "//div[@class='content']/div[@class='pluginList']/table[2]";
var table = doc.DocumentNode.SelectSingleNode(xpath);

// unfortunately the `tr` tags are not closed so HAP interprets
// this table having a single row with multiple descendant `tr`s
var rows = table.Descendants("tr")
    .Skip(1); // skip header row

var query =
    from row in rows
    // there may be a row with an embedded ad
    where row.SelectSingleNode("td/script") == null
    // each row has 6 columns so we need to grab the next 6 descendants
    let columns = row.Descendants("td").Take(6).ToList()
    let titleText = columns[1].Elements("a").Select(a => a.InnerText).FirstOrDefault()
    let authorText = columns[2].Elements("a").Select(a => a.InnerText).FirstOrDefault()
    let downloadLink = columns[5].Elements("a").Select(a => a.GetAttributeValue("href", null)).FirstOrDefault()
    select new
    {
        Title = titleText ?? "",
        Author = authorText ?? "",
        FileName = Path.GetFileName(downloadLink ?? ""),
    };
因此,现在您可以迭代查询并写出每一行所需的内容

foreach (var item in query)
{
    Console.WriteLine("{0} ({1})", item.FileName, item.Author);
}

如果一个URL只包含
.jar
?author=
中的一个,那该怎么办,因为通过该检查,我可以检测出它是作者还是普通链接:)。我的问题是为了让你思考在这种情况下会发生什么-你的代码会做什么?@Oded我认为它会扫描每个链接和作者,并将它们放在彼此旁边,但它似乎不是那样工作的。就像我说的-如果一个URL只包含
.jar
?author=
中的一个,会发生什么?逐行检查代码中的4种排列(只有一种或另一种,两者都存在或都不存在)。如果URL只包含
.jar
?author=
中的一种,该怎么办,因为通过该检查,我可以检测出它是作者还是普通链接:)。我的问题是为了让你思考在这种情况下会发生什么-你的代码会做什么?@Oded我认为它会扫描每个链接和作者,并将它们放在彼此旁边,但它似乎不是那样工作的。就像我说的-如果一个URL只包含
.jar
?author=
中的一个,会发生什么?逐行检查你的代码中的4种排列(只有一种或另一种,两者都存在或都不存在)!我还没有听说过xpath,接下来我将研究它,这段代码就像一个符咒:o!哇,万分感谢:哦!我还没有听说过xpath,接下来我将研究它,这段代码就像一个符咒:o!