Есть ли способ выполнить строки в течение l oop? - PullRequest
0 голосов
/ 03 апреля 2020

Я создал массив, который содержит все возможные теги html, которые при запуске будут переходить к целевой строке или ничего.

group = ['div','span','a','link','dl','dt','dd','b','p','meta','']
comb = []

for g1 in group:
    if g1 != '':
        for g2 in group:
            if g2 != '':
                for g3 in group:
                    if g3 != '':
                        res = "tag."+g1+"."+g2+"."+g3+".string"
                        comb.append(res)
                    else:
                        res = "tag."+g1+"."+g2+".string"
                        comb.append(res)
            else:
                res = "tag."+g1+".string"
                comb.append(res)    

Я хочу запустить каждую запись в массиве, чтобы увидеть, что она возвращает с данного веб-сайта.

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:
        exec(c, globals())

Есть ли способ запустить строку в списке в виде кода, подобного что делает exec()? Я использую BeautifulSoup, Requests, Googlesearch и Re на Python 3

1 Ответ

1 голос
/ 03 апреля 2020

Вам не нужно 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 хорошей идеей или нет, я беру без сторон.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...