我最近一直在使用漂亮的汤4,我一直在努力了解一些基础知识(由于某种原因我对bs3.x很满意)。因此,举例来说,让我们开始做一些简单的事情:
data=soup.find_all('h2')
这让我产生了类似的东西:
<h2><a href=\"/accurate-data/210-0023.prd?pageLevel=&skuId=210-0023\">more-accurate-data</a></h2>
哪个好。但是当我想要正则表达式上面的字符串时,使用沿线的东西(假设上面存储在“temp”中):
t=str(re.compile(r"""<h2><a href=\\"/accurate(.*?)\\">""").search(str(temp)).group(1))
我明白了:
AttributeError: 'NoneType' object has no attribute 'group'
我觉得很奇怪 - 因为,当我在python解释器上做的时候,像是:
k=r"""<h2><a href=\"/accurate-data/210-0023.prd?pageLevel=&skuId=210-0023\">more-accurate-data</a></h2>"""
然后使用上面的正则表达式,一切正常。我想知道为什么bs4生成的“标签”类型似乎不是正则表达式。现在我觉得我可能正在做一些愚蠢的事情,或者bs3.x和bs4之间的某些事情发生了变化,我不知道。任何有关这方面的帮助将不胜感激。感谢。
答案 0 :(得分:2)
您应该尝试查看字符串的repr
:
>>> a=r"""<h2><a href=\"/accurate-data/210-0023.prd?pageLevel=&skuId=210-0023\">more-accurate-data</a></h2>"""
>>> print repr(a)
'<h2><a href=\\"/accurate-data/210-0023.prd?pageLevel=&skuId=210-0023\\">more-accurate-data</a></h2>'
正则表达式适用于这种表示:
>>> regex = re.compile(r"""<h2><a href=\\"/accurate(.*?)\\">""")
>>> regex.match(a)
<_sre.SRE_Match object at 0x20fbf30>
问题在于,美丽的汤的结果是不同的,因为你没有打印它的repr。在处理正则表达式时,最好检查所涉及字符串的repr
以避免这样的事情。