【问题标题】:How to loop removing text from a string?如何循环从字符串中删除文本?
【发布时间】:2019-06-25 18:45:12
【问题描述】:

我希望从网站上获取定价信息。为此,我使用正则表达式来查找第一个“$”所在的所有实例。从那里我使用子字符串来获取接下来的 7 个字符,例如42,945 美元。我删除了“$”之前的所有文本,并对位于我通过For循环使用的网站上的不同 $ 金额值重复该过程多次。

我遇到的问题是在我修剪字符串然后转到下一个 $ 之后,重新创建了原始字符串。

这是我正在使用的代码:

WebClient client = new WebClient();
string allcontent = client.DownloadString("example.com");

string body = allcontent.Substring(140480,200000);

Regex rx = new Regex("[$]");

var numberCount = rx.Matches(body).Count;

string price = String.Empty;
string price2 = String.Empty;
int match = Int32.MaxValue;
string trimmed = String.Empty;

List<string> priceList = new List<string>();

for (int i = 0; i < numberCount; i++)
{

    trimmed = body;

    match = rx.Match(trimmed).Index;

    price = trimmed.Substring(match, 7);

    priceList.Add(price);

    trimmed = trimmed.Remove(0, match + 7);

}

Console.WriteLine(priceList[0]);
Console.WriteLine(priceList[1]);

Console.ReadKey();

假设字符串为:ABC $300 DEF $600 GHI $120 JKF $980

在第一次循环迭代后,我应该得到$300,在第二次循环中得到$600,依此类推。相反,我每次都收到$300

如何解决这个问题以获得正确的值?

【问题讨论】:

  • 在您的for 循环中,您在每个循环的顶部分配trimmed = body。另外,为什么不直接使用Regex.Matches 并使用适当的正则表达式拉出价格?
  • 你可以简单地分割文本并解析字符串的每个开头,如this
  • foreach(Match match in Regex.Matches("ABC $300 DEF $600 GHI $120 JKF $980", @"\$\d+")) Console.WriteLine(match.Value);

标签: c# regex web-scraping


【解决方案1】:

现有代码从字符串的开头开始删除,而不是从匹配的位置开始。但我们可以简化这一点,使其更多地依赖于 RegEx 匹配提供的数据:

var priceList = new List<string>();
var rx = new Regex("[$]([0-9]{1,2},)?[0-9]{3}");

using (var client = new WebClient())
{
    string body = client.DownloadString("example.com").Substring(140480,200000);
    var matches = rx.Matches(body);

    foreach (var match in matches)
    {
        priceList.Add(match);
    }   
}

Console.WriteLine(priceList[0]);
Console.WriteLine(priceList[1]);

Console.ReadKey(true);

修改后的表达式将匹配整个价格值。你可以在这里看到它的工作原理:

https://dotnetfiddle.net/1DltMh

但即使是这段代码似乎也很脆弱。使用正则表达式解析 HTML 是 generally frowned upon。对您正在抓取的网站格式的任何微小更改都会严重破坏这一点。看看real HTML parser.,你可能会做得更好

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-12-16
    • 1970-01-01
    • 2020-10-13
    • 2022-01-16
    • 2016-07-13
    • 1970-01-01
    • 2020-01-10
    相关资源
    最近更新 更多