Использование строки для представления тега в объекте BeautifulSoup - PullRequest
0 голосов
/ 27 ноября 2018

Скажем, у меня есть объект BeautifulSoup с именем bs4.Чтобы использовать функцию find_all_next bs4 для тега p, я бы просто сделал:

bs4.p.find_all_next(string = True)

Я хочу добавить это в цикл for для всех тегов, доступных на веб-странице:

temp_set = set()
for x in bs4.find_all():
    temp_set.add(x.name) # Store only tag name, no dupes, order doesn't matter

Однако, когда приходит время, используйте его в объекте bs4:

for x in temp_set:
    bs4.x.find_all_next(string = True) # x is supposed to represent the tag name; attribute error

Я знаю, что не существует никакого тега 'x', поэтому я получаю ошибку атрибута, есть ли что-нибудь, что яможно сделать так, чтобы символ 'x' в цикле символизировал тег, который он должен представлять, как если бы я выводил его на консоль?

1 Ответ

0 голосов
/ 27 ноября 2018

состояния документа здесь :

getattr (x, 'foobar') эквивалентно x.foobar

Так что, когда я попробовал это, я просто перебрал:

getattr(bs4, x).find_all_next(string = True)

, как сказано в документе, эквивалентно bs4.x.find_all_next(string = True) с x в качестве переменной

Я не уверен, что вы хотите оттуда сделать.

Не все элементы в вашем наборе будут работать, поэтому я просто зациклил, бросил их в список, а затем выбросил исключения в список, чтобы увидеть, что не сработало.И «select» даст AttributeError: 'function' object has no attribute 'find_all_next'

, так что в основном вот что я сделал в последнем разделе.Опять же, делай, что хочешь, но ты переберишь getattr(bs4, x).find_all_next(string = True)

final_list = []
failed_x = []

for x in temp_set:
    try:
        final_list.append(list(getattr(bs4, x).find_all_next(string = True)))
    except:
        failed_x.append(x)
        continue
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...