找回密码
 加入
搜索
查看: 6011|回复: 10

[系统综合] 求一个复杂正则

  [复制链接]
发表于 2014-4-29 12:55:05 | 显示全部楼层 |阅读模式
本帖最后由 sex123 于 2014-4-29 13:00 编辑

现在有一个读取网页过程后,获取到网页源代码。问题来了,网页代码复杂多变,网页上面显示的文字也是变化的,不过我只想提出其中的一个链接,这个链接的文字显示一般是有特征性的,一般就是几个字符来回的变化。一般是以下的字符中的一个。
Get PDF
Download full text
PDF
Download PDF
Fulltext PDF
之类的。
我想获取这样的字符的所代表的url地址。
想得到的代码的最终的效果是,事先不知道是打开的是什么网页,也不知道会显示出来的网页特征的字符是什么,不过一定是上面写的这些行字符其中的一个(用if? array?),当然,这个字符以后还会有少量的增加和补充。另外,网页刷出来后,特征字符有时会是上面这些中的一个,也有的网页在这些字符后面还显示出文件的大小(文件大小不一定是多少,比如刷出来这样的字符Get PDF (760K)或者这样的Fulltext PDF (2 Mb)),用代码得取出这一个特征字符(比如刷出的网页显示的是特征字符是Get PDF)所代表的链接。

下面是一些网页源码的一部分,每一行都代表不同的网页。
<a href="/doi/10.1002/pmic.201200057/pdf" title="Article in pdf format" id="journalToolsPdfLink" shape="rect">Get PDF (760K)</a>
<a class="pdf" target="_blank" href="/doi/pdf/10.1080/09658211.2012.710431">Download full text</a>
<a href="/content/173/8/176.1.full.pdf+html" rel="full-text.pdf">PDF</a>
<a href="/pmc/articles/PMC3573624/pdf/cvj_03_207.pdf">PDF (1.8M)</a>
<a class="download-pdf" href="/eye/journal/v25/n5/pdf/eye201182a.pdf">Download PDF</a>
<a href="/content/216/6/1003.full.pdf+html" rel="view-full-text.pdf">PDF</a>
<a id="pdfLink" rel="nofollow" href="http://www.sciencedirect.com/science/article/pii/S1146609X14000460/pdfft?md5=86b8e611797f3fb3410fa8683cf33454&pid=1-s2.0-S1146609X14000460-main.pdf" queryStr="?_origin=article&_zone=toolbar&_srcFr=rslt_list_item" target="newPdfWin"   pdfurl="http://www.sciencedirect.com/science/article/pii/S1146609X14000460/pdfft?md5=86b8e611797f3fb3410fa8683cf33454&pid=1-s2.0-S1146609X14000460-main.pdf" queryStr="?_origin=article&_zone=toolbar&_srcFr=rslt_list_item"  class="S_C_pdfLink big pdf ext_sdlink cLink" style="cursor:pointer" title="Download PDF" >Download PDF</a>
<a class="btn contentmnu downloadbtn" href="/Article/Pdf/355765" style="float:right;padding-top: 3px;" target="_blank">Fulltext PDF (2 Mb)</a>
发表于 2014-4-29 22:32:53 | 显示全部楼层
给你个思路,
1 提取所有超链接
2 判断是否包含关键字
3 提取有效链接
#include "array.au3"

$a = FileRead("d:\a.txt")
$aa = "Get PDF,Download full text,PDF,Download PDF,Fulltext PDF"
;1
$b = StringRegExp($a, '<a[^>]*>[^>]+</a>', 3)
_ArrayDisplay($b)

For $i = 0 To UBound($b) - 1
        ;2
        $t = StringRegExp($b[$i], '>([^\(]+).*<', 3)
        If IsArray($t) Then
                If StringInStr($aa, $t[0]) Then
                        ;3
                        $c = StringRegExp($a, '(?<=href=")([^"]+)', 3)
                        If IsArray($c) Then MsgBox(262144, "提取到符合条件的链接:", $c[0], 5)
                EndIf
        EndIf
Next
 楼主| 发表于 2014-4-29 23:03:55 | 显示全部楼层
给你个思路,
1 提取所有超链接
2 判断是否包含关键字
3 提取有效链接
pcbar 发表于 2014-4-29 22:32

出错了,我指的是文字显示出来的是有这几个特征符,不是说链接里面包括pdf也算在内的,我建了一个a.txt,第一行是干扰项,第二行才是真正的想要的,结果msgbox出来的是第一行。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?加入

×
发表于 2014-4-30 08:40:46 | 显示全部楼层
回复 3# sex123

昨天的回贴写错了一个变量,15行的$a应改为$b[$i]
如果要完全匹配,可以用数组精确比对
#include "array.au3"

$a = FileRead("d:\a.txt")
$aa = "Get PDF,Download full text,PDF,Download PDF,Fulltext PDF"
;1
$b = StringRegExp($a, '<a[^>]*>[^>]+</a>', 3)
_ArrayDisplay($b)

For $i = 0 To UBound($b) - 1
        ;2
        $t = StringRegExp($b[$i], '>([^\(]+).*<', 3)
        If IsArray($t) Then
                If StringInStr($aa, $t[0]) Then
                        ;3
                        $c = StringRegExp($b[$i], '(?<=href=")([^"]+)', 3)
                        If IsArray($c) Then MsgBox(262144, "提取到符合条件的链接:", $c[0], 5)
                EndIf
        EndIf
Next
发表于 2014-4-30 09:58:49 | 显示全部楼层
你要的是这个吗?
#include <Array.au3>

$Str = _
'<a href="/doi/10.1001/pmic.201200011/pdf" title="Article in pdf format" id="journalToolsPdfLink" shape="rect">Get (760K)</a>' & @CRLF & _
'<a href="/doi/10.1002/pmic.201200057/pdf" title="Article in pdf format" id="journalToolsPdfLink" shape="rect">Get PDF (760K)</a>' & @CRLF & _
'<a class="pdf" target="_blank" href="/doi/pdf/10.1080/09658211.2012.710431">Download full text</a>' & @CRLF & _
'<a href="/content/173/8/176.1.full.pdf+html" rel="full-text.pdf">PDF</a>' & @CRLF & _
'<a href="/pmc/articles/PMC3573624/pdf/cvj_03_207.pdf">PDF (1.8M)</a>' & @CRLF & _
'<a class="download-pdf" href="/eye/journal/v25/n5/pdf/eye201182a.pdf">Download PDF</a>' & @CRLF & _
'<a href="/content/216/6/1003.full.pdf+html" rel="view-full-text.pdf">PDF</a>' & @CRLF & _
'<a id="pdfLink" rel="nofollow" href="http://www.sciencedirect.com/science/article/pii/S1146609X14000460/pdfft?md5=86b8e611797f3fb3410fa8683cf33454&pid=1-s2.0-S1146609X14000460-main.pdf" queryStr="?_origin=article&_zone=toolbar&_srcFr=rslt_list_item" target="newPdfWin"   pdfurl="http://www.sciencedirect.com/science/article/pii/S1146609X14000460/pdfft?md5=86b8e611797f3fb3410fa8683cf33454&pid=1-s2.0-S1146609X14000460-main.pdf" queryStr="?_origin=article&_zone=toolbar&_srcFr=rslt_list_item"  class="S_C_pdfLink big pdf ext_sdlink cLink" style="cursor:pointer" title="Download PDF" >Download PDF</a>' & @CRLF & _
'<a class="btn contentmnu downloadbtn" href="/Article/Pdf/355765" style="float:right;padding-top: 3px;" target="_blank">Fulltext PDF (2 Mb)</a>'
Local $Test = StringRegExp($Str, 'href="([^"]+)".*?PDF', 3)

_ArrayDisplay($Test, UBound($Test))
 楼主| 发表于 2014-4-30 11:58:23 | 显示全部楼层
你要的是这个吗?
lixiaolong 发表于 2014-4-30 09:58



    要的不是这个,我说的意思是这些例子,每一行可能出现在刷出来的网页上面,而不是所有的这些链接同时出现在一个刷出来的网页上面,另外,要的是分析文字部分,而你的可能会分析id name这些吧,最后,我例子中的没有pdf文本的那一行没有显示出来。
 楼主| 发表于 2014-4-30 11:59:17 | 显示全部楼层
回复  sex123

昨天的回贴写错了一个变量,15行的$a应改为$b[$i]
如果要完全匹配,可以用数组精确比对
pcbar 发表于 2014-4-30 08:40



    这个还是不行,我附件中的第一行还是被显示出来了,这个第一行是干扰项的,显示的文本是get,而不是get pdf,但也被msgbox出来了。
发表于 2014-4-30 13:40:23 | 显示全部楼层
(?mi)href="([^>"]+).*?"\h*>(?:Get\h+PDF|Download\h+full\h+text|PDF|Download\h+PDF|Fulltext\h+PDF)[^<]*</a
 楼主| 发表于 2014-4-30 14:20:10 | 显示全部楼层
afan 发表于 2014-4-30 13:40



    这个。。。如果关键词以后一点一点增加的话就不好办了。
发表于 2014-4-30 14:26:00 | 显示全部楼层
楼主非得让别人给你写完整的代码嘛?
#include "array.au3"

$a = FileRead(@DesktopDir & "\a.txt")
Global $aa[5] = ["Get PDF", "Download full text", "PDF", "Download PDF", "Fulltext PDF"]
;1
$b = StringRegExp($a, '<a[^>]*>[^>]+</a>', 3)
;_ArrayDisplay($b)

For $i = 0 To UBound($b) - 1
        ;2
        $t = StringRegExp($b[$i], '>([^\(]+).*<', 3)
        If IsArray($t) Then
                If _ArraySearch($aa, StringStripWS($t[0], 2)) <> -1 Then
                        ;3
                        $c = StringRegExp($b[$i], '(?<=href=")([^"]+)', 3)
                        If IsArray($c) Then FileWriteLine(@DesktopDir&"\有效链接.txt",$c[0])
                EndIf
        EndIf
Next
ShellExecuteWait(@DesktopDir&"\有效链接.txt")
FileDelete(@DesktopDir&"\有效链接.txt")
发表于 2014-4-30 14:42:34 | 显示全部楼层
这个。。。如果关键词以后一点一点增加的话就不好办了。
sex123 发表于 2014-4-30 14:20



    关键词用变量代入,有何难? 自己稍微动一下
您需要登录后才可以回帖 登录 | 加入

本版积分规则

QQ|手机版|小黑屋|AUTOIT CN ( 鲁ICP备19019924号-1 )谷歌 百度

GMT+8, 2024-5-16 09:39 , Processed in 0.087235 second(s), 24 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表