【问题标题】:How can i escape "?我怎么能逃脱“?
【发布时间】:2015-06-05 20:51:50
【问题描述】:
if (richTextBox1.Lines[i].StartsWith(@"<a href=""") ||
     richTextBox1.Lines[i].EndsWith(@""""))

StartsWith 应该是&lt;a href=" EndsWith 应该是一个 "

但是现在我没有得到任何结果。

输入举例:

<a href="/setprefs?suggon=2&amp;prev=https://www.test.com/search?q%3D%2Band%2B%26espv%3D2%26biw%3D960%26bih%3D489%26source%3Dlnms%26tbm%3Disch%26sa%3DX%26ei%3DYrxxVb-hJqac7gba0YOgDQ%26ved%3D0CAYQ_AUoAQ&amp;sig=0_seDQVVTDQQx1hvN3BRktZNFc9Ew%3D" style="left:-1000em;position:absolute">Screen-reader users, click here to turn off ggg Instant.</a>

我需要得到这部分:

/setprefs?suggon=2&amp;prev=https://www.test.com/search?q%3D%2Band%2B%26espv%3D2%26biw%3D960%26bih%3D489%26source%3Dlnms%26tbm%3Disch%26sa%3DX%26ei%3DYrxxVb-hJqac7gba0YOgDQ%26ved%3D0CAYQ_AUoAQ&amp;sig=0_seDQVVTDQQx1hvN3BRktZNFc9Ew%3D

之间的部分

我也尝试过使用 htmlagilitypack:

HtmlAgilityPack.HtmlWeb hw = new HtmlAgilityPack.HtmlWeb();

                        HtmlAgilityPack.HtmlDocument doc = hw.Load("https://www.test.com");                       

                        foreach (HtmlAgilityPack.HtmlNode link in doc.DocumentNode.SelectNodes("//a[@href]"))
                        {
                            string hrefValue = link.GetAttributeValue("href", string.Empty);

                                if (!newHtmls.Contains(hrefValue) && hrefValue.Contains("images"))
                                    newHtmls.Add(hrefValue);
                        }

但这只给了我 1 个链接。 当我浏览并查看页面视图源时,我使用图像或图像这个词进行搜索和过滤,我得到了 350 多个结果。

我也试过这个解决方案:

var document = new HtmlWeb().Load(url);
var urls = document.DocumentNode.Descendants("img")
                                .Select(e => e.GetAttributeValue("src", null))
                                .Where(s => !String.IsNullOrEmpty(s));

但它没有给我我需要的结果。

忘了提及我将页面内容的视图源复制到richTextBox1 窗口,然后我从richTextBox1 逐行读取文本,所以也许这就是我没有得到我需要的结果的原因?

for (int i = 0; i < richTextBox1.Lines.Length; i++)
                {
                    if (richTextBox1.Lines[i].StartsWith("<a href=\"") &&
                        richTextBox1.Lines[i].EndsWith("\""))
                    {
                        listBox1.Items.Add(richTextBox1.Lines[i]);
                    }
                }

也许浏览器(chrome)中的视图源内容与richTextbox1中的不同。也许我不应该从richTextBox1中逐行阅读它,也许先从richTextBox1中阅读整个文本?

【问题讨论】:

  • 应该是这样...
  • 请显示输入值。
  • 不会以"&gt; 结尾吗?正如丹尼尔所说,需要输入值。顺便说一句,你真的应该在 HtmlAgilityPack 上寻找这种东西。
  • 也应该是 && 而不是 ||如果您需要两个表达式都为真。
  • " 用 and \ 转义: .StartsWith("

标签: c# .net winforms html-agility-pack


【解决方案1】:

根据您的输入,EndsWith 没有帮助(因为您的输入实际上以 &lt;/a&gt; 结尾。您的下一个最佳选择是存储 href=" 的位置(位置),然后查找下一次出现的 " 从您存储的位置开始。例如

var input = @"<a href=""/setprefs?suggon=2&amp;prev=https://www.test.com/search?q%3D%2Band%2B%26espv%3D2%26biw%3D960%26bih%3D489%26source%3Dlnms%26tbm%3Disch%26sa%3DX%26ei%3DYrxxVb-hJqac7gba0YOgDQ%26ved%3D0CAYQ_AUoAQ&amp;sig=0_seDQVVTDQQx1hvN3BRktZNFc9Ew%3D"" style=""left:-1000em;position:absolute"">Screen-reader users, click here to turn off ggg Instant.</a>";

var needle = @"href=""";
var start = input.IndexOf(needle);
if (start != -1)
{
    start += needle.Length;
    var end = input.IndexOf(@"""", start);

    // final result:
    var href = input.Substring(start, end - start).Dump();
}

比这更好的是使用一个实际的 HTML 解析器(我可以推荐 HtmlAgilityPack 吗?)。

【讨论】:

    猜你喜欢
    • 2011-01-26
    • 1970-01-01
    • 2015-06-03
    • 2014-05-28
    • 1970-01-01
    • 2021-11-16
    • 2021-12-29
    • 2012-12-26
    相关资源
    最近更新 更多