Python爬虫相关基础问题
Python爬虫相关内容代码在下方,为什么上面那种写法的运行结果不会带有'<a href="xxxx">'两边的内容呢?而只是找出了其中的网址。findLink变量中存储的是正则表达式模板,findall函数在查找的时候不应该是按照正则表达式将其全部查找出来吗?为什么只有网址呢?
在下方还有两行测试代码,如果不加双引号和网址的正则表达式,则可以查找出'<a href=',这是为什么呢?findall函数的使用有什么注意事项吗?
import re
# 模板
# findLink = re.compile(r'<a href="(.*?)">')
# 输出:https://movie.douban.com/subject/1292052/
findLink = re.compile(r'<a href=')
# 输出:<a href=
# 查找对象
item = r'<a href="https://movie.douban.com/subject/1292052/">dfsafdsafdsa'
# 查找
link = re.findall(findLink, item)
print(link) re.findall('href=\".*\/">', item)这种就带前后
re.findall('href=\"(.*)\/">', item)这种就不带前后
加了()就有输出限定了
给个完整版 如果网络允许静态爬虫的话,那么正则明显不如xpath有优势 第四行(.*?),所以输出的是这个括号里的内容,第七行是去找<a href= 南归 发表于 2022-8-5 22:31
第四行(.*?),所以输出的是这个括号里的内容,第七行是去找
意思是说像这样用正则表达式匹配查找的时候,如果正则表达式里面有括号的话就找和括号里匹配的内容;如果正则表达式里面没有括号,再找其他的内容。原理是这样吗?{:9_241:} 本帖最后由 liuzhengyuan 于 2022-8-6 10:34 编辑
Buryool 发表于 2022-8-5 23:54
意思是说像这样用正则表达式匹配查找的时候,如果正则表达式里面有括号的话就找和括号里匹配的内容;如果 ...
可以参考:https://hankchow.github.io/2018/08/11/a-pitfall-of-re-findall-with-brackets-in-Python/
如果不想匹配括号可以可以把 "?:" 加在第一个括号后面 re.findall('href=\"(.*)\/">', item)
输出['https://movie.douban.com/subject/1292052']
<a href="(.*?)">写法直白点讲就是匹配并且只显示.*这部分,再直白说就是先匹配出<a href="到">之间的内容,然后只输出()里匹配的内容,如果不加()则显示完整的<a到>
re.findall('href=\".*\/">', item)
输出['href="https://movie.douban.com/subject/1292052/">'] 显示全部还是只显示链接,是是否有()决定的,没有()则显示所有,有()则根据()前后内容匹配但只输出()内的内容 Buryool 发表于 2022-8-5 23:54
意思是说像这样用正则表达式匹配查找的时候,如果正则表达式里面有括号的话就找和括号里匹配的内容;如果 ...
你理解错了,是根据()前后内容查找,但是只输出()中匹配的部分 另外提一句,要是元素清晰的话最好用css选择器,使用起来比正则轻松多了 cflying 发表于 2022-8-5 08:47
懂了懂了!太感谢了!! liuzhengyuan 发表于 2022-8-6 02:58
可以参考:https://hankchow.github.io/2018/08/11/a-pitfall-of-re-findall-with-brackets-in-Python/ ...
已解决!非常感谢!!
页:
[1]