这是我的代码:
gasprices = requests.get("insert url here")
soup = BeautifulSoup(gasprices.content)
price1 = soup.find("div", class_="sp_p")
price1list = re.search('(p[0-9])', str(price1))
price1解析为以下字符串:
< div class="sp_p">< div class="p2"></div>< div class="pd"></div>< div class="p8"></div>< div class="p1"></div></div>
现在,当我在Pythex中运行时,它会匹配"p2"
,"p8"
和"p1"
这就是我想要的。但是,当我在python3的正则表达式解释器中运行它时,它只匹配"p2"
。我在这里搞砸了什么?
答案 0 :(得分:2)
re.search
将搜索匹配的第一个实例,因此它赢了; t给你所有的匹配。
相反,请使用re.findall(pattern, string)
获取所有匹配项。
>>> import re
>>> string = """< div class="sp_p">< div class="p2"></div>< div class="pd"></div>< div class="p8"></div>< div class="p1"></div></div>"""
>>> re.search('(p[0-9])', string)
<_sre.SRE_Match object at 0x7fdefc9ee558>
>>> re.findall('(p[0-9])', string)
['p2', 'p8', 'p1']
答案 1 :(得分:1)
此外,您可以让BeautifulSoup
完成工作,找到所有div
个匹配p\d+
正则表达式(p
后跟一个或多个数字)的类:
import re
from bs4 import BeautifulSoup
data = """
<div class="sp_p"><div class="p2"></div><div class="pd"></div><div class="p8"></div><div class="p1"></div></div>
"""
soup = BeautifulSoup(data)
print soup.find_all('div', class_=re.compile(r'p\d+'))
打印:
[<div class="p2"></div>, <div class="p8"></div>, <div class="p1"></div>]
在您的情况下,用法是:
price1.find_all('div', class_=re.compile(r'p\d+'))