正则表达式提取内容

hztgcl1986 2007-10-24 05:12:11
用Microsoft.XMLHTTP获得某网页内容并转换成字符数据后,想要用正则网页中提取所有<a>标记及其内容
Pattern = "(^<a.+href=['""]?.{4,}>.+<\/a>$)"
虽说能够获取,但是内容如下:

<a href="/Default.html">8848so</a> <a href="d.html">ddd</a>
<a href='http://www.google.cn/search?complete=1&hl=zh-CN&ie=GB2312&q=ASP+href%D5%FD%D4%F2&meta='>复杂</a>
<a href=http://www.thws.cn/article.asp?id=911 dir="ltr" class="无 CSS 样式">无单双引号</a>

第一行,把两个<a>给当成一个提取了
此Pattern只能正确提取一行中有一个<a>标记的数据,如果一行内有多个,则错误的当成了一个提取

请各位高手指点
...全文
994 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
hztgcl1986 2007-10-25
  • 打赏
  • 举报
回复
" <a[^ >]* >[^ >]+ </a >"
还是一个都没取到.请高手再想想办法

"<a.+href=['""]?.{4,}>.+<\/a>",我的这个是能取到的,但是如果一行内有多个<a></a>,它会当成一个来处理,我操作的是整个网页的源码,各种情况都有,有就是一行中好几个<a></a>,下面是用我的表达式的结果:

<a href="/Default.html" >8848so </a > <a href="d.html" >ddd </a >
<a href=http://www.thws.cn/article.asp?id=911 dir="ltr" class="无 CSS 样式" >无单双引号 </a >

明显的,第一行中是两个<a></a>,但是却取成了一个.
我觉得,关键在<a></a>中间的表达式如何写,我写成了:".+",这应该是造成取多个的关键.
什么都不能 2007-10-25
  • 打赏
  • 举报
回复
"<a[^>]*>[^>]+</a>"
本来是想写取href的值<a></a>间的文本和整个<a...>...</a>
看来是出了问题,你可以用上面那个取整个超链接的代码。
hztgcl1986 2007-10-25
  • 打赏
  • 举报
回复
hanpoyangtitan,感谢你的回复
可是换了你的表达式后,一个<a>都取不到了,Matches.Count = 0
hztgcl1986 2007-10-25
  • 打赏
  • 举报
回复
To: hanpoyangtitan


问题己解决,分都给你了

" <a[^ >]* >[^ >]+ </a >" ,这是我复制的你的帖子,之前不成功,是因为复制粘贴之后,表达式中有空格

感谢!
whgfu 2007-10-25
  • 打赏
  • 举报
回复
/(http:\/\/\[^" ']+)/gm
/href *= *['"]*(\S+)["']* */gm
这两个可以取去href地址
whgfu 2007-10-25
  • 打赏
  • 举报
回复
没事,慢慢来,我相信你可以哈。。。
hztgcl1986 2007-10-25
  • 打赏
  • 举报
回复
确实取不到,你不会是没有测试吧.
要用我的全部代码,取得一网页内容,然后测试,要是自己写上几个字符串测试,可能不是正确效果.
什么都不能 2007-10-25
  • 打赏
  • 举报
回复
在我这里能取到到你那里就取不到?看来是人品问题。
什么都不能 2007-10-24
  • 打赏
  • 举报
回复
"<a[^>]*href=[""|']?([^>]+)[""|']?[^>]*>([^<]+)</a>"
hztgcl1986 2007-10-24
  • 打赏
  • 举报
回复
<!--提取对象页-->
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
<title>8848so</title>
</head>

<body>
<a href="/Default.html">8848so</a> <a href="d.html">ddd</a>
<a href='http://www.google.cn/search?complete=1&hl=zh-CN&ie=GB2312&q=ASP+href%D5%FD%D4%F2&meta='>复杂</a>
<a href=http://www.thws.cn/article.asp?id=911 dir="ltr" class="无 CSS 样式">无单双引号</a>
</body>
</html>
hztgcl1986 2007-10-24
  • 打赏
  • 举报
回复
'全部代码
<%@LANGUAGE="VBSCRIPT" CODEPAGE="936"%>
<%
Dim url,data,startCode,endCode
url = "http://www.hr-sd.com/person/skin/index1.asp?jobid=25794"
url = "http://www.8848so.com"
startCode = "<body>"
endCode = "</body>"
On Error Resume Next
data = getURLFile(url)
data = BytesToStr(data,"GB2312")
data = getContent(data,startCode,endCode,1)
AddressReplace(data)

Function getURLFile(url) '获取URL二进制数据
Dim xmlHTTP
Set xmlHTTP = Server.CreateObject("Microsoft.XMLHTTP")

xmlHTTP.Open "Get",url,False
xmlHTTP.Send()
getURLFile = xmlHTTP.ResponseBody

If Not(xmlHTTP.ReadyState = 4 And xmlHTTP.Status = 200) Then
Response.Write("<font color='#FF0000'>"&url&"</font>文件获取失败.")
Response.End()
End If

Set xmlHTTP = Nothing
End Function

Function BytesToStr(bytesData,encoding) '二进制To字符串
Dim stream
Set stream = Server.CreateObject("ADODB.Stream")

stream.Type = 1 '二进制
stream.Open()
stream.Write(bytesData)

stream.Position = 0
stream.Type = 2 '字符串
stream.CharSet = encoding
'stream.Position = 2
'过滤掉开始的一个控制字符,这个控制字符是WriteText方法按默认属性Charset="Unicode"读入数据的时候自动加到数据开头的,
'字符的值是FF3F,这个控制字符占2字节,所以Position设置为2,表示略过2个字节,下面的ReadText方法从Position开始读数据
BytesToStr = stream.ReadText()

Set stream = Nothing
End Function

Function getContent(htmlData,startCode,endCode,incCode) '主要内容截取
Dim startPos,endPos,length,tempContent
startPos = Instr(1,htmlData,startCode)
endPos = Instr(startPos,htmlData,endCode)

length = (endPos - startPos) + Len(endCode)
tempContent = Mid(htmlData,startPos,length)
Select Case incCode:
Case 0: '不包括startCode,不包括endCode
tempContent = Right(tempContent,Len(tempContent) - Len(startCode) - 2)
getContent = Left(tempContent,Len(tempContent) - Len(endCode) - 2)
Case 1: '包括startCode,包括endCode
getContent = tempContent
Case 2: '不包括startCode,包括endCode
getContent = Right(tempContent,Len(tempContent) - Len(startCode) - 2)
Case 3: '包括startCode,包括endCode
getContent = Left(tempContent,Len(tempContent) - Len(endCode) - 2)
Case Else:
getContent = tempContent
End Select

End Function

Function AddressReplace(htmlData)
Dim re,matches
Set re = New RegExp
re.IgnoreCase = True
re.Multiline = True
re.Global = True
re.Pattern = "(^<a.+href=['""]?.{4,}>.+<\/a>$)"
Set matches = re.Execute(htmlData)
Response.Write(matches.Count)&"<br />"
For Each m In matches
Response.Write(Server.HTMlEncode(m.Value)&"<br />")
Next

End Function
%>

28,391

社区成员

发帖
与我相关
我的任务
社区描述
ASP即Active Server Pages,是Microsoft公司开发的服务器端脚本环境。
社区管理员
  • ASP
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧