【问题标题】:Parsing Nodes with HTML AgilityPack使用 HTML AgilityPack 解析节点
【发布时间】:2018-04-11 18:37:30
【问题描述】:

我正在尝试从该页面获取信息:http://www.wowhead.com/transmog-sets?filter=3;5;0#transmog-sets

检查元素时,行看起来像这样:

我试过这段代码,但每次在任何节点上都会返回 null:

public class ItemSetsTransmog
                {
                    public string ItemSetName { get; set; }
                    public string ItemSetId { get; set; }
                }

                public partial class Fmain : Form
                {
                    DataTable Table;
                    HtmlWeb web = new HtmlWeb();

                    public Fmain()
                    {
                        InitializeComponent();
                        initializeItemSetTransmogTable();

                    }

                    private async void Fmain_Load(object sender, EventArgs e)
                    {
                        int PageNum = 0;
                        var itemsets = await ItemSetTransmogFromPage(0);
                        while (itemsets.Count > 0)
                        {
                            foreach (var itemset in itemsets)
                                Table.Rows.Add(itemset.ItemSetName, itemset.ItemSetId);

                            itemsets = await ItemSetTransmogFromPage(PageNum++);
                        }

                    }

                    private async Task<List<ItemSetsTransmog>> ItemSetTransmogFromPage(int PageNum)
                    {
                        String url = "http://www.wowhead.com/transmog-sets?filter=3;5;0#transmog-sets";
                        if (PageNum != 0)
                            url = "http://www.wowhead.com/transmog-sets?filter=3;5;0#transmog-sets:75+" + PageNum.ToString();

                        var doc = await Task.Factory.StartNew(() => web.Load(url));
                        var NameNodes = doc.DocumentNode.SelectNodes("//*[@id=\"tab - transmog - sets\"]//div//table//tr//td//div//a");
                        var IdNodes = doc.DocumentNode.SelectNodes("//*[@id=\"tab - transmog - sets\"]//div//table//tr//td//div//a");

                        // if these are null it means the name/score nodes couldn't be found on the html page
                        if (NameNodes == null || IdNodes == null)
                            return new List<ItemSetsTransmog>();

                        var ItemSetNames = NameNodes.Select(node => node.InnerText);
                        var ItemSetIds = IdNodes.Select(node => node.InnerText);

                        return ItemSetNames.Zip(ItemSetIds, (name, id) => new ItemSetsTransmog() { ItemSetName = name, ItemSetId = id }).ToList();
                    }

                    private void initializeItemSetTransmogTable()
                    {
                        Table = new DataTable("ItemSetTransmogTable");
                        Table.Columns.Add("ItemSetName", typeof(string));
                        Table.Columns.Add("ItemSetId", typeof(string));

                        ItemSetTransmogDataView.DataSource = Table;
                    }
                }
            }

为什么我的脚本没有加载任何这些节点?我该如何解决?

【问题讨论】:

    标签: c# xpath html-parsing html-agility-pack


    【解决方案1】:

    您的代码不会加载这些节点,因为它们不存在于由 HTML Agility Pack 拉回的 HTML 中。这可能是因为您显示的大部分标记都是由 JavaScript 生成的。只需尝试检查 ItemSetTransmogFromPage() 方法中的 doc.ParsedText 属性。

    Html Agility Pack 是一个 HTTP 客户端/解析器,它不会运行脚本。如果您确实需要使用此过程获取数据,那么您将需要使用“无头浏览器”,例如 Optimus 来检索页面(警告:我没有使用过这个库,虽然 nuget 包似乎存在)和然后可能使用 HTML Agility Pack 来解析/查询标记。

    另一种选择可能是尝试解析此页面上存在的 JSON(如果这为您提供了所需的数据,尽管这似乎不太可能)。

    小记 - 我认为 xpath 中的 id 应该是“tab-transmog-sets”而不是“tab - transmog - sets”

    【讨论】:

    • 谢谢!我已将页面转换为 Json 并解析它,它工作得很好。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-05-03
    • 1970-01-01
    • 2021-11-26
    • 2012-10-30
    • 1970-01-01
    • 2010-12-25
    • 1970-01-01
    相关资源
    最近更新 更多