原以为 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))
能够正确的打出字来。
个人的一些实践:
- 只去掉 BS4 中的 td 标签,仍然为空。
- re.compile(r'bgwhite\st-(\w+)+')改为 re.compile(r'bgwhite'),能够搜索出,但是因为有其他标签混杂在一起,所以不合适。
- 而且这个我不用正则的直接 class_=xxx 的效果一样。
- re.compile(r'bgwhite.)不行,这里应该是因为没写个数,随便改一下 re.compile(r'bgwhite.{0,100}'),也就和 2 的情况一样了。但是一旦{0 , 100}改为{1 , 100}就又搜不到了。
- re.compile(r'bgwhite.?')可行,和 2 的情况一样,全部混在一起了。实际上就跟没有这个正则一样
猜测:
- BS4 里的正则大概什么不一样的吗?尤其是对空格的处理。我了解了下,只是说是 match 模式,从开头字符串开始匹配。
- class 属性无法支持带元字符的正则? text , href 我都有使用过带元字符的正则,可行,但是 class_属性不支持?(感觉不太可能难)
- 我写错了关于空格的正则,但是为什么 RE 模块可以……