【问题标题】:extract text from <p>...</p> tag or directly from an HTML file从 <p>...</p> 标记或直接从 HTML 文件中提取文本
【发布时间】:2012-06-27 18:26:47
【问题描述】:

我有一个 HTML 页面,其中包含一些我想从网络服务器下载的文件名。 我需要阅读这些文件名以创建一个列表,该列表将传递给从服务器下载文件的 Web 应用程序。这些文件名有一些扩展名。

我已经深入研究过这个话题,但除了 -

  1. 正则表达式不能用于解析 HTML。
  2. 使用HTML Agility Pack

没有其他方法可以让我从 HTML 文件中搜索具有类似 filename.ext 模式的文本吗?

包含文件名的示例 HTML -

 <p class=3DMsoNormal style=3D'margin-top:0in;margin-right:0in;margin-bottom=:0in; margin-left:1.5in;margin-bottom:.0001pt;text-indent:-.25in;line-height:normal;mso-list:l1 level3 lfo8;tab-stops:list 1.5in'><![if !supportLists]> <span style=3D'font-family:"Times New Roman","serif";mso-fareast-font-family:"Times New Roman"'><span style=3D'mso-list:Ignore'>1.<span style=3D'font:7.0pt "Times New Roman"'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
    </span></span></span><![endif]><span style=3D'font-family:"Times New Roman","serif"; mso-fareast-font-family:"Times New Roman"'>**13572_PostAccountingReport_2009-06-03.acc**<o:p></o:p></span></p>

我不能使用HTML Agility Pack,因为我不允许下载和使用任何应用程序或工具。

这不能通过其他任何逻辑来实现吗?

这是我到目前为止所做的

string pageSource = "";
            string geturl = @"C:\Documents and Settings\NASD_Download.mht";
            WebRequest getRequest = WebRequest.Create(geturl);
            WebResponse getResponse = getRequest.GetResponse();
            using (StreamReader sr = new StreamReader(getResponse.GetResponseStream()))
            {
                pageSource = sr.ReadToEnd();
                pageSource.Replace("=", "");
            }
           var fileNames = from Match m in Regex.Matches(pageSource, @"[0-9]+_+[A-Za-z]+_+[0-9]+-+[0-9]+-+[0-9]+.+[a-z]")
                          select m.Value;
            foreach (var s in fileNames)
                Response.Write(s);

由于每个文件名中出现一些“=”,我无法获取文件名。如何删除pageSource string中出现的“=”

提前致谢

阿基尔

【问题讨论】:

  • 我在示例中看不到文件名... :(
  • 13572_PostAccountingReport_2009-06-03.acc
  • .ext 在哪里?!它可以是每个扩展?规则是什么?
  • .ext 只是一个例子。我的意思是它可以是任何 abc.acc 或 abc.zip 等。
  • 所以这是不可能的,祝你今天愉快,我只是浪费时间写一个答案。 :(

标签: c# asp.net html regex html-agility-pack


【解决方案1】:

好吧,知道regex 在 HTML 中查找值并不理想:

var files = [];
var p = document.getElementsByTagName('p');

for (var i = 0; i < p.length; i++){
    var match = p[i].innerHTML.match(/\s(\S+\.ext)\s/)

    if (match)
        files.push(match[1]);
}

Live DEMO

注意: 阅读问题的 cmets。

如果扩展名可以是任何东西,你可以使用这个:

var files = [];
var p = document.getElementsByTagName('p');

for (var i = 0; i < p.length; i++){
    var match = p[i].innerHTML.match(/\b(\S+\.\S+)\b/)
    console.log(match)
    if (match)
        files.push(match[1]);
}
document.getElementById('result').innerHTML = files + "";

​ 但这真的真的不靠谱。

Live DEMO

【讨论】:

  • 这对我帮助很大,伙计。但仍然没有得到我想要的。但是还是学到了很多.....谢谢:)
  • @akhil。请注意它会因为这样的愚蠢事情而失败:&lt;p&gt; I hate him.Once I even told him... &lt;/p&gt;
  • :D 哈哈哈我知道会的。 stackoverflow.com/a/11222645/1474528我们不能从这个答案中找出什么吗???
  • @akhil。确实,我见过比这更好的答案。
【解决方案2】:

好吧,您可以使用正则表达式来提取看起来像文件名的内容。正如您正确指出的那样,因为正则表达式不解析 HTML,所以您可能会得到误报,即,您可能会得到看起来像文件名但不是的结果。

举个例子:

string html = @"<p class=3DMsoNormal ...etc...";

var fileNames = from Match m in Regex.Matches(html, @"\b[A-Za-z0-9_-]+\.[A-Za-z0-9_-]{3}\b") 
                select m.Value;

foreach (var s in fileNames)
    Console.WriteLine(s);
Console.ReadLine();

这将返回

1.5in
1.5in
7.0pt
13572_PostAccountingReport_2009-06-03.acc

您会看到,看起来像文件名的 HTML 内容将被返回。当然,您可以细化正则表达式(例如,将+ 替换为{3,},这样点之前的部分至少需要三个字符),以便过滤掉本例中的误报。不过,它始终是近似结果,而不是精确结果。

【讨论】:

  • 非常感谢。如何从我从文件中读取的字符串中删除“=”?
  • @akhil:使用pageSource = pageSource.Replace("=", "");。请注意开头的pageSource = ...,你错过了!
  • 但是如果我想捕获正则表达式模式的多个 macthes 怎么办。我写的代码只是返回我第一次匹配然后终止。
【解决方案3】:

由于1.5in-.25in7.0pt之类的原因,可能无法使用通用模式获取文件名,请尝试更具体(如果可能),例如
/[a-z0-9_-]+\.[a-z]+/gi
/&gt;[a-z0-9_-]+\.[a-z]+&lt;/gi(包括标记)甚至
/&gt;\d+_PostAccountingReport_\d+-\d+-\d+\.[a-z]+&lt;/gi

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-12-16
    • 1970-01-01
    • 2010-10-29
    • 1970-01-01
    • 1970-01-01
    • 2021-11-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多