我应该从具有前十个列表的文件中提取文本组:每个列表的名称,等级等。您可以在此处查看文件和正则表达式 https://regex101.com/r/fXK5YV/1。它在那里工作,您可以看到捕获组。
import re
pattern = '''
(?P<list><lisclass="regular-search-result">(.|n)*?(?<=<span class="indexed-biz-name">)
(?P<rank>d{1,2})
(.|n)*?<span>
(?P<name>.+)
</span>(.|n)*?alt="
(?P<stars>d.d)
sstarsrating"(.|n)*?<span class="review-count rating-qualifier">(s|t|n)*?
(?P<numrevs>d{1,7})(.|n)*?<spansclass="business-attributesprice-range">
(?P<price>${1,6})
</span>(.|n)*?</li>)
'''
pattern_matcher = re.compile(pattern, re.VERBOSE)
matches = pattern_matcher.match(yelp_html)
这将打印None
.
yelp_html
里面肯定有文字.
我做错了什么?
我看到两个问题:
-
您没有使用原始字符串(在字符串前面加上
r
(,这意味着您的反斜杠将尝试表示特殊事物,而不是字符串的一部分。
我相信您的多行字符串将 尝试将每行之间的换行符和字符串开头的空格匹配到您的正则表达式中(您不想要,因为这不是正则表达式在您的链接中格式化的方式(。
import re
pattern = r'''
(?P<list><lisclass="regular-search-result">(.|n)*?(?<=<spansclass="indexed-biz-name">)
(?P<rank>d{1,2})
(.|n)*?<span>
(?P<name>.+)
</span>(.|n)*?alt="
(?P<stars>d.d)
sstarsrating"(.|n)*?<spansclass="review-countsrating-qualifier">(s|t|n)*?
(?P<numrevs>d{1,7})
(.|n)*?<spansclass="business-attributesprice-range">
(?P<price>${1,6})
</span>(.|n)*?</li>)
'''
pattern_matcher = re.compile(pattern, re.VERBOSE)
matches = pattern_matcher.finditer(yelp_html)
for item in matches:
print(item.group('rank', 'name', 'stars', 'numrevs', 'price'))