Вам не нужно exec()
, ни eval()
для доступа к атрибуту Dynami c, используйте getattr()
или, в случае BeautifulSoup
, метод find()
, чтобы получить первый дочерний элемент, соответствующий заданным критериям:
from itertools import chain, product
group = ['div','span','a','link','dl','dt','dd','b','p','meta']
# Produce a list of tuples of element names
comb = list(chain(*[product(*[group] * n) for n in range(1, 4)]))
def get_web_price(url):
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.149 Safari/537.36'}
page = requests.get(url, headers=headers)
soup = BeautifulSoup(page.content, "lxml")
tag = soup.find(class_=re.compile("price"))
for c in comb:
t = tag
for a in c:
t = t.find(a)
if not t:
break
if not t:
continue
# Do something with t.string
t.string
Вы также можете использовать select()
с пределом для того же эффекта, я думаю:
def get_web_price(url):
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.149 Safari/537.36'}
page = requests.get(url, headers=headers)
soup = BeautifulSoup(page.content, "lxml")
tag = soup.find(class_=re.compile("price"))
for c in comb:
selector = ' '.join(c)
r = tag.select(selector, limit=1)
if r:
r = r[0]
else:
continue
r.string
Что касается того, является ли очистка результатов поиска Google хорошей идеей или нет, я беру без сторон.