0

所以我正在加载一些远程内容,需要使用正则表达式来隔离一些标签的内容。

  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 数据以获取这些内容?我应该使用正则表达式吗?

4

3 回答 3

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))
于 2012-06-06T19:32:23.680 回答
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 文档的最有效方式(以防您要处理大量数据)。

于 2012-12-12T10:22:00.240 回答
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函数返回在数据中找到的第一个字符串,因此该函数将完全满足您的需要。

于 2012-05-28T18:03:07.523 回答