【问题标题】:Convert HTML table to CSV using Html Agility Pack使用 Html Agility Pack 将 HTML 表格转换为 CSV
【发布时间】:2014-03-08 22:50:48
【问题描述】:

我想从 id = statsTable 的表中提取所有元素,并希望我可以将所有数据读入 csv。

这是我目前所拥有的:

// Create a request for the URL. 
WebRequest request = WebRequest.Create("http://www.pgatour.com/stats/stat.120.html");
Console.WriteLine("Requesting data from: http://www.pgatour.com/stats/stat.120.html");

// If required by the server, set the credentials.
request.Credentials = CredentialCache.DefaultCredentials;

WebResponse response = request.GetResponse();

using (Stream stream = response.GetResponseStream())
{
    StreamReader reader = new StreamReader(stream);

    // covert html to string
    String responseString = reader.ReadToEnd();

    HtmlDocument doc = new HtmlDocument();

    doc.LoadHtml(responseString);

    var desktopFolder = Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory);
    var fullFileName = Path.Combine(desktopFolder, "GolfStats.csv");

    using (var PlayerFile = new StreamWriter(fullFileName))
    {
        PlayerFile.WriteLine("Data downloaded: " + DateTime.Now);

        var myTable = doc.DocumentNode
                        .Descendants("table")
                        .Where(table => table.Attributes.Contains("id"))
                        .SingleOrDefault(table => table.Attributes["id"].Value == "statsTable");

        var myTableValues = myTable.Descendants("td");

        foreach (var tdV in myTableValues)
        {
            PlayerFile.WriteLine(tdV.InnerText);
            Console.WriteLine(tdV.InnerText);
        }

        PlayerFile.Flush();
    }
}

问题是我的 csv 只是在单个列中列出数据,以及选择放置在表格中的广告(请参阅 webRequest 中的 url)。如果您能帮我以表格格式输出数据,那就太好了!

【问题讨论】:

  • 您希望在其他列中有什么内容?
  • 第 1 列 - 本周排名 第 2 列 - 最后排名 第 3 列 - 周球员姓名 第 4 列 - 回合 第 5 列 - 平均第 6 列 - 总冲程 第 7 列 - 总调整 第 8 列 - 总回合
  • @user3371361 有理由大喊大叫吗?
  • 对不起,我从网页复制了标题(全部大写!)

标签: c# linq csv html-agility-pack


【解决方案1】:

您为每个表格单元格创建一个新行。改变它,使每个表格行都有一个单独的行替换

var myTableValues = myTable.Descendants("td");
foreach (var tdV in myTableValues)
{
    PlayerFile.WriteLine(tdV.InnerText);
    Console.WriteLine(tdV.InnerText);
}

var myTableRows = myTable.Descendants("tr").Where(tr => tr.Attributes.Contains("id"));
foreach (var tr in myTableRows)
{
    string line = string.Join(";", tr.Descendants("td").Select(td => td.InnerText));
    PlayerFile.WriteLine(line);
    Console.WriteLine(line);
}

.Where(tr => tr.Attributes.Contains("id")) 过滤掉广告,因为带有广告的表格行没有 id 而所有玩家行都有。

【讨论】:

  • 这几乎就是我想要的!如果我将 string.Join(";" 更改为 string.Join("," 输出的 csv 几乎正是我所需要的,除了前两列?!这些仍然列在第一列中。
  • 使用逗号分隔列将无法正常工作,因为某些列包含逗号。因此,我像 Excel 一样使用分号来处理 csv 文件。
  • 啊,好吧!如何将其布局到与网页相同的列中?
猜你喜欢
  • 1970-01-01
  • 2017-02-17
  • 1970-01-01
  • 2013-07-20
  • 2012-02-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-29
相关资源
最近更新 更多