所以我正在加载一些远程内容,需要使用正则表达式来隔离某些标签的内容。
set xmlhttp = CreateObject("MSXML2.ServerXMLHTTP")
xmlhttp.open "GET", url, false
xmlhttp.setRequestHeader "Content-Type", "application/x-www-form-urlencoded"
xmlhttp.setRequestHeader "Accept-Language", "en-us"
xmlhttp.send "x=hello"
status = xmlhttp.status
if err.number <> 0 or status <> 200 then
if status = 404 then
Response.Write "[EFERROR]Page does not exist (404)."
elseif status >= 401 and status < 402 then
Response.Write "[EFERROR]Access denied (401)."
elseif status >= 500 and status <= 600 then
Response.Write "[EFERROR]500 Internal Server Error on remote site."
else
Response.write "[EFERROR]Server is down or does not exist."
end if
else
data = xmlhttp.responseText
我基本上需要获取<title>Here is the title</title>
的内容以及元描述,关键字和一些选定的开放图元数据。
最后,我需要获取第一个 <h1>Heading</h1>
和<p>Paragraph</p>
如何解析html数据以获取这些内容?我应该使用正则表达式吗?
答案 0 :(得分:1)
我实际上最终使用了这个解决方案,因为它也解决了代码中有类名的问题。
Function GetFirstMatch(PatternToMatch, StringToSearch)
Dim regEx, CurrentMatch, CurrentMatches
Set regEx = New RegExp
regEx.Pattern = PatternToMatch
regEx.IgnoreCase = True
regEx.Global = True
regEx.MultiLine = True
Set CurrentMatches = regEx.Execute(StringToSearch)
GetFirstMatch = ""
If CurrentMatches.Count >= 1 Then
Set CurrentMatch = CurrentMatches(0)
If CurrentMatch.SubMatches.Count >= 1 Then
GetFirstMatch = CurrentMatch.SubMatches(0)
End If
End If
Set regEx = Nothing
End Function
title = clean_str(GetFirstMatch("<title[^>]*>([^<]+)</title>",data))
firstpara = clean_str(GetFirstMatch("<p[^>]*>([^<]+)</p>",data))
firsth1 = clean_str(GetFirstMatch("<h1[^>]*>([^<]+)</h1>",data))
答案 1 :(得分:1)
您可以使用.responseXML属性来检索所需的内容,而无需使用正则表达式。由于您要查找<title>
,<h1>
和<p>
标记内的数据,因此返回的文档可能是HTML。如果HTML文档根据XML规范格式良好,则可能意味着在获得响应后,它已经自动解析并可访问。
所以你可以试试这个:
Dim objData
Set objData = xmlhttp.responseXML.selectSingleNode("//*[local-name() = 'title']")
If objData Is Nothing Then
Response.Write "# no result #<br />"
Else
Response.Write "title: " & objData.Text & "<br />"
End If
但请注意,此XPath表达式可能不是查询XML文档的最有效方式(如果您要处理大量数据)。
答案 2 :(得分:0)
将Mid
功能与Instr
功能结合使用。我构建了一个函数,它使用Mid
函数通过使用Instr
函数查找每个标记的位置来确定标记包装文本:
Function GetInnerData(Data,TagOpen,TagClose)
OpenPos = Instr(1,data,TagOpen,1)
ClosePos = Instr(1,data,TagClose,1)
If OpenPos > 0 And ClosePos > 0 Then GetInnerData = Trim(Mid(data,OpenPos+Len(TagOpen),ClosePos-(OpenPos+Len(TagOpen))))
End Function
当您像这样运行此功能时,它将返回My Title
<%=GetInnerData("any text <title>My Title</title> any text","<title>","</title>")%>
在你的情况下,你会这样做:
TitleData = GetInnerData(data,"<title>","</title>")
这将获取<title>
标记中的内容。
或
H1Data = GetInnerData(data,"<h1>","</h1>")
这将获取<h1>
代码中的内容。
Instr
函数返回数据中找到的第一个字符串,因此该函数将完全符合您的需要。