求一个复杂正则
本帖最后由 sex123 于 2014-4-29 13:00 编辑现在有一个读取网页过程后,获取到网页源代码。问题来了,网页代码复杂多变,网页上面显示的文字也是变化的,不过我只想提出其中的一个链接,这个链接的文字显示一般是有特征性的,一般就是几个字符来回的变化。一般是以下的字符中的一个。
Get PDF
Download full text
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> 给你个思路,
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) Then
;3
$c = StringRegExp($a, '(?<=href=")([^"]+)', 3)
If IsArray($c) Then MsgBox(262144, "提取到符合条件的链接:", $c, 5)
EndIf
EndIf
Next
给你个思路,
1 提取所有超链接
2 判断是否包含关键字
3 提取有效链接
pcbar 发表于 2014-4-29 22:32 http://www.autoitx.com/images/common/back.gif
出错了,我指的是文字显示出来的是有这几个特征符,不是说链接里面包括pdf也算在内的,我建了一个a.txt,第一行是干扰项,第二行才是真正的想要的,结果msgbox出来的是第一行。 回复 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) Then
;3
$c = StringRegExp($b[$i], '(?<=href=")([^"]+)', 3)
If IsArray($c) Then MsgBox(262144, "提取到符合条件的链接:", $c, 5)
EndIf
EndIf
Next 你要的是这个吗?#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)) 你要的是这个吗?
lixiaolong 发表于 2014-4-30 09:58 http://www.autoitx.com/images/common/back.gif
要的不是这个,我说的意思是这些例子,每一行可能出现在刷出来的网页上面,而不是所有的这些链接同时出现在一个刷出来的网页上面,另外,要的是分析文字部分,而你的可能会分析id name这些吧,最后,我例子中的没有pdf文本的那一行没有显示出来。 回复sex123
昨天的回贴写错了一个变量,15行的$a应改为$b[$i]
如果要完全匹配,可以用数组精确比对
pcbar 发表于 2014-4-30 08:40 http://www.autoitx.com/images/common/back.gif
这个还是不行,我附件中的第一行还是被显示出来了,这个第一行是干扰项的,显示的文本是get,而不是get pdf,但也被msgbox出来了。 (?mi)href="([^>"]+).*?"\h*>(?:Get\h+PDF|Download\h+full\h+text|PDF|Download\h+PDF|Fulltext\h+PDF)[^<]*</a
afan 发表于 2014-4-30 13:40 http://www.autoitx.com/images/common/back.gif
这个。。。如果关键词以后一点一点增加的话就不好办了。 楼主非得让别人给你写完整的代码嘛?#include "array.au3"
$a = FileRead(@DesktopDir & "\a.txt")
Global $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 _ArraySearch($aa, StringStripWS($t, 2)) <> -1 Then
;3
$c = StringRegExp($b[$i], '(?<=href=")([^"]+)', 3)
If IsArray($c) Then FileWriteLine(@DesktopDir&"\有效链接.txt",$c)
EndIf
EndIf
Next
ShellExecuteWait(@DesktopDir&"\有效链接.txt")
FileDelete(@DesktopDir&"\有效链接.txt") 这个。。。如果关键词以后一点一点增加的话就不好办了。
sex123 发表于 2014-4-30 14:20 http://www.autoitx.com/images/common/back.gif
关键词用变量代入,有何难? 自己稍微动一下
页:
[1]