BeautifulSoup4 найти все не вложенные совпадения

У вас есть несколько ошибок. Я начну вверху и начну свой путь.

dir = os.getcwd()

Это мертвый код, так как вы никогда не ссылаетесь на dir. Любой linter должен предупредить вас об этом. Удалите его.

currTime = time.time()  # nit: camelCase is not idiomatic in Python, use curr_time or currtime
day = (30 * 86400)  # nit: this should be named thirty_days, not day. Also 86400 seems like a magic number
                    # maybe day = 60 * 60 * 24; thirty_days = 30 * day

executionDate = currTime - day  # nit: camelCase again...

Обратите внимание, что executionDate теперь всегда за 30 дней до времени.

if currTime > executionDate:

Что? Почему мы это проверяем? Мы уже знаем, что executionDate за 30 дней до этого прямо сейчас!

    os.remove(filePath)

Вы пытаетесь удалить каталог? Huh?


Что вы пытаетесь делать, я думаю, это проверить каждый файл в каталоге, сравнить его временную метку создания (или последняя измененная временная метка? Я не уверен) до значения тридцать дней назад и удаляю этот файл, если это возможно. Вы хотите os.stat и os.listdir

for fname in os.listdir(filePath):
    ctime = os.stat(os.path.join(filePath, fname)).st_ctime
    if ctime < cutoff:  # I've renamed executionDate here because it's a silly name
        try:
            os.remove(os.path.join(filePath, fname))
        except Exception as e:
            # something went wrong, let's print what it was
            print("!! Error: " + str(e))
        else:
            # nothing went wrong
            print("Deleted " + os.path.join(filePath, fname))
1
задан PlasmaBinturong 18 January 2019 в 17:49
поделиться

2 ответа

Я, наконец, сделал следующее, что имеет преимущество в том, что он не разрушительный. Кроме того, у меня нет времени на его тестирование, но я просто надеялся, что это позволит избежать прохождения каждого вложенного элемента, как в ответе @ Bitto-Bennichan, но на самом деле это неуверенно. В любом случае, он делает то, что хотел:

all_fetched = []
fetched = soup.find('div', class_='wanted')

while fetched is not None:
    all_fetched.append(fetched)
    try:
        last = list(fetched.descendants)[-1]
    except IndexError:
        break
    fetched = last.findNext('div', class_='wanted')
0
ответ дан PlasmaBinturong 18 January 2019 в 17:49
поделиться

Вы можете передать функцию в качестве аргумента find_all, в дополнение к другим аргументам. А внутри вы можете проверить с помощью find_parents (), чтобы убедиться, что у него нет div верхнего уровня с тем же классом. Используйте find_parents(), так как он будет проверять всех родителей, а не только их непосредственных родителей, так что вы получите только самый внешний «требуемый» div.

def top_most_wanted(tag):
    children_same_class=tag.find_parents("div", class_="wanted")
    if len(children_same_class) >0:
        return False
    return True
soup=BeautifulSoup(text,'html.parser')
print(soup.find_all(top_most_wanted,'div',class_="wanted"))
0
ответ дан Bitto Bennichan 18 January 2019 в 17:49
поделиться
Другие вопросы по тегам:

Похожие вопросы: