我有一个HTML页面,其中包含一些我想从网络服务器下载的文件名。 我需要读取这些文件名才能创建一个列表,该列表将传递给我从服务器下载文件的Web应用程序。这些文件名有一些扩展名。
我已经开始讨论这个话题但除了 -
之外没有任何东西没有别的方法可以搜索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"'>
</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
提前致谢
AKHIL
答案 0 :(得分:0)
嗯,知道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]);
}
注意: 阅读问题的评论。
如果扩展名可以是任何内容,您可以使用:
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 + "";
但这真的不可靠。
答案 1 :(得分:0)
好吧,你可以使用正则表达式来提取看起来像文件名的东西。因为,正如您正确指出的那样,正则表达式不会解析 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,}
,以便点之前的部分至少需要三个字符),以便此示例中的误报为过滤掉了。不过,它总是一个近似结果,而不是一个确切的结果。
答案 2 :(得分:0)
由于1.5in
-.25in
7.0pt
等等,可能无法使用常见模式获取文件名,尝试更具体(如果可能),例如
/[a-z0-9_-]+\.[a-z]+/gi
或
/>[a-z0-9_-]+\.[a-z]+</gi
(包括标记)或甚至是
/>\d+_PostAccountingReport_\d+-\d+-\d+\.[a-z]+</gi