vigiles 发表于 2015-3-4 13:43:32

【已解决】请教StringRegExp提取网页源码中的字符串

本帖最后由 vigiles 于 2015-3-4 15:36 编辑



如图所示,页面中有这样的源码:

<li>

<span id="newPmName_1" class="param-name param-explain" data-url="/product_param/index2893.html" data-text="根据所显xxxxxx">产品类型</span>
<span id="newPmVal_1"><a href='/projector/s1938/'>家用投影机</a></span>
<em class="edit_param" data-rel='newPmName_1,newPmVal_1,416'>纠错</em>
</li>



希望得到“家用投影机”这个字符串。确实不会写正则,先试着提取其在内的一段字符串,我尝试使用:
$target = StringRegExp($body, '产品类型</span>(.*?)</span>', 3)
不能成功,发现因为斜线 “/” 导致错误,无法提取字符串。
对正则太没有感觉了,查看文档只导致越来越晕,尝试:
$target = StringRegExp($body, '产品类型<\/span>(.*?)<\/span>', 3)
$target = StringRegExp($body, '产品类型<[:/]span>(.*?)<[:/]span>', 3)
都没能成功,$target都是无效的


请教各位网友,这个"/"如何使之不影响提取,这段正则应该如何写

vigiles 发表于 2015-3-4 14:10:05

又试了下:
$target = StringRegExp($body, '产品类型(.*?)em', 3)
得到的错误是
@error: 1 = 给定的"数组"并非数组.
也就是说,条件里有汉字也不可以?

afan 发表于 2015-3-4 14:14:16

产品类型<[\s\S]+?>([^<]+?)</

vigiles 发表于 2015-3-4 14:17:18

回复 3# afan $target = StringRegExp($body, '产品类型<[\s\S]+?>([^<]+?)</', 3)我试了下,错误为 @error: 1 = 给定的"数组"并非数组.

wangms 发表于 2015-3-4 14:53:08

回复 3# afan

A大出手就不一样,也帮帮我吧http://www.autoitx.com/thread-47301-1-1.html

vigiles 发表于 2015-3-4 15:36:07

回复 3# afan


    谢谢!
原来是编码的问题,这样就可以了BinaryToString($xmlhttp.responseBody, 1)

vigiles 发表于 2015-3-4 16:24:14

回复 3# afan


    再请教下:包装清单</span><spanid="newPmVal_28">明基i700&nbsp;x1<br/>快速使用指南&nbsp;x1<br/>VGA线&nbsp;x1<br/>使用手册CD&nbsp;x1<br/>电源线&nbsp;x1<br/>遥控器&电池&nbsp;x1</span>这样的,如何提取为:明基i700x1 快速使用指南x1 VGA线x1 使用手册CDx1 电源线x1 遥控器&电池x1及时不能如此理想,大致的也可

afan 发表于 2015-3-4 16:29:42

回复 7# vigiles


    先提取整串,再删除&nbsp;这些占位符等

vigiles 发表于 2015-3-4 16:54:29

本帖最后由 vigiles 于 2015-3-4 16:56 编辑

回复 8# afan

   不太明白StringRegExp($body, "输入端子<[\s\S]+?>([^<]+?)</", 3)里条件的意思。感觉正则很难理解。你像这里$xmlhttp = ObjCreate("MSXML2.XMLHTTP.3.0")
$xmlhttp.open("GET", "http://detail.zol.com.cn/391/390427/param.shtml", False)
$xmlhttp.send()

$body = BinaryToString($xmlhttp.responseBody, 1)
$body = StringStripCR($body)
$body = StringStripWS($body, 8)

Local $array = StringRegExp($body, "输入端子<[\s\S]+?>([^<]+?)</", 3)
_arrayDisplay($array)我希望是提取到全部内容,但只能提取到最后一个

afan 发表于 2015-3-4 17:22:15

回复 9# vigiles Local $xmlhttp = ObjCreate('MSXML2.XMLHTTP.3.0')
$xmlhttp.open('GET', 'http://detail.zol.com.cn/391/390427/param.shtml', False)
$xmlhttp.send()
Local $body = BinaryToString($xmlhttp.responseBody, 1)
Local $array = StringRegExp($body, '(?s)输入端子<.+?">(.+?)</', 1)
If @error Then Exit
Local $s = StringRegExpReplace($array, '<br />\s+', '        ')
MsgBox(0, 0, $s)

llww7779 发表于 2015-3-8 22:13:46

'(?s)输入端子<.+?">(.+?)</'中,(?s)做什么用啊!,查了半天没弄明白!

llww7779 发表于 2015-3-8 22:43:22

知道了,模式修饰符,模式修饰符

下面列出了当前可用的 PCRE 修饰符。括号中提到的名字是 PCRE 内部这些修饰符的名称。 模式修饰符中的空格,换行符会被忽略,其他字符会导致错误。



i (PCRE_CASELESS)如果设置了这个修饰符,模式中的字母会进行大小写不敏感匹配。m (PCRE_MULTILINE)默认情况下,PCRE 认为目标字符串是由单行字符组成的(然而实际上它可能会包含多行), "行首"元字符 (^) 仅匹配字符串的开始位置, 而"行末"元字符 ($) 仅匹配字符串末尾, 或者最后的换行符(除非设置了 D 修饰符)。这个行为和 perl 相同。   当这个修饰符设置之后,“行首”和“行末”就会匹配目标字符串中任意换行符之前或之后,另外, 还分别匹配目标字符串的最开始和最末尾位置。这等同于 perl 的 /m 修饰符。如果目标字符串 中没有 "\n" 字符,或者模式中没有出现 ^ 或 $,设置这个修饰符不产生任何影响。s (PCRE_DOTALL)如果设置了这个修饰符,模式中的点号元字符匹配所有字符,包含换行符。如果没有这个 修饰符,点号不匹配换行符。这个修饰符等同于 perl 中的/s修饰符。 一个取反字符类比如 [^a] 总是匹配换行符,而不依赖于这个修饰符的设置。x (PCRE_EXTENDED)如果设置了这个修饰符,模式中的没有经过转义的或不在字符类中的空白数据字符总会被忽略, 并且位于一个未转义的字符类外部的#字符和下一个换行符之间的字符也被忽略。 这个修饰符 等同于 perl 中的 /x 修饰符,使被编译模式中可以包含注释。 注意:这仅用于数据字符。 空白字符 还是不能在模式的特殊字符序列中出现,比如序列 (?( 引入了一个条件子组(译注: 这种语法定义的 特殊字符序列中如果出现空白字符会导致编译错误。 比如(?(就会导致错误)。

vigiles 发表于 2015-3-9 09:00:48

回复 12# llww7779


    谢谢!学习了!

nchxzy 发表于 2015-4-6 12:08:20

谢谢!学习了!
页: [1]
查看完整版本: 【已解决】请教StringRegExp提取网页源码中的字符串