原以为 BS 带正则很王道,但是今天边走神边写码,就是没有办法写出匹配如下标签的正则,感觉应该是我哪里写错了。我把两边的代码复制过,但是没有用。
匹配了以后是想要标签的内容,而不是这个标签,所以还是用 BS4 比较合适。所以比较不好绕过,而且这里绕过了,以后还得碰上,索性就想问个明白。
字很多,其实重点就是两串代码为什么 BS4 无法匹配,正则可以匹配。我的猜测什么的都可以不用管……
想要搜索的标签示例:
<td class="bgwhite t-汉字"> 1</td>
标示汉字的位置,会是随机的一个汉字。
BS4 的正则:
soup.find_all('td', class_=re.compile(r'bgwhite\st-(\w+)+')):
搜索出来为空。
re 模块正则:
result = re.findall(re.compile(r'bgwhite\st-(\w+)+'), str(soup))
能够正确的打出字来。
个人的一些实践:
猜测:
2
adv007 2016-07-23 07:49:20 +08:00 via iPhone 1
\w 匹配不出汉字
|
4
a412739861 OP |
5
practicer 2016-07-23 12:40:40 +08:00 1
只匹配汉字的话:
soup.find_all('td', class_=re.compile(ur'bgwhite\st-[\u4e00-\u9fff]+')) 在 Unicode 编码中只匹配汉字。 4E00-9FFF 为中文字符编码区 |
6
a412739861 OP |
7
practicer 2016-07-23 16:33:54 +08:00
@a412739861 我的 py2.7 windows 环境下可行
|
8
a412739861 OP @practicer
怎么测……找到一个类似情况的网页,然后用 BS4 去 find_all 里面找么…… |
9
a412739861 OP 已解决。
@aristotll BS4 对多值的判断好像是只要满足其中一个就会可以,所以搜索还是不太好用。如果这个多值属性是唯一,可以直接拼写,但是如果要在这个里面放正则,好像就立刻不行了。 @adv007 \w 能匹配汉字 @practicer 你测试的是正则而不是多值属性标签吧,正则本身就是可以的 --- 我的理解是,如果你用了空格,恐怕就很难搜到一个符合的标签。 解决思路在这。 http://stackoverflow.com/questions/12552211/multiple-values-for-class-attribute 用一个 lambda 匿名函数,对 tag 进行多值属性的判断,在这里可以对每个多值属性进行单独的判断,是否符合正则。 也许还有更简单的解决办法吧……不过直接多值属性放正则似乎是不行的。 python3 , bs4.4 。 |