Есть ли способ распечатать (в консоли) и запустить ввод как расширение страницы Beautiful Soup -Python - PullRequest
0 голосов
/ 28 мая 2019

фон:

Я изучаю веб-скребинг и решил использовать Python и красивый суп наскрести, эта программа попросит у пользователя ссылку и сузит свой поиск в HTML на веб-странице.

Проблема:

Когда я прошу пользователя определить свое собственное расширение для суповой страницы (EX .div.div.a), и я добавляю это ко всей строке и пытаюсь выполнить ее в функции печати, она всегда возвращает None. Как мне запустить расширение и распечатать его из собранного пользовательского ввода? для этого примера я собираю поиск графических карт в Newegg.

пример ссылки: https://www.newegg.com/Video-Cards-Video-Devices/Category/ID-38?Tpk=graphics%20cards

Имейте в виду, из кода ниже, я уже использовал findAll для div class = "item-info", поэтому он будет искать расширение в этом блоке кода.

Я уже пробовал exec () строку, но, похоже, это не работает

isdone = ""
while isdone != "done":
    try:
        route = "container"
        userinput = input("what extensions would you like to search for?\n seperate each denotion with a space \n ex: div div img[\"title\"]\n: ")
        inputRoute = userinput.split(' ')
        for i in range(len(inputRoute)):
            route += "." + inputRoute[i]        
        print("---\n"+route+"\n---")
        print("Current Route ^\n---")
        print("output:\n", exec(route),"\n---")#actual resaults if user had inputed a
        print(container.a) # what i actually want to output (if the user only inputed a) 
        #add the abilitie to add extensions ex: container.div.a.img["foo"] -ignore this stackoverflow
        isdone = input("are you happy with these extensions? \n type 'done' when happy\n or enter to change extension\n: ") 
    except Exception as e:
        print(e)
        input("Make sure their is no leftover spaces\npress enter to continue")

'#' - мои комментарии во время вывода ЭТО КОНСОЛЬНЫЙ ВЫХОД:

'what extensions would you like to search for?
 seperate each denotion with a space
 ex: div div img["title"]
: a                 #  <--what I put in the input
---
container.a #what  
---
Current Route ^
---
output:              
 None               #  <-- what actually outputs when i use exec()
---
<a class="item-brand" href="https://www.newegg.com/EVGA/BrandStore/ID-1402"> 
<img alt="EVGA" class="lazy-img" data-effect="fadeIn" data-src="//c1.neweggimages.com/Brandimage_70x28//Brand1402.gif" src="//c1.neweggimages.com/WebResource/Themes/2005/Nest/blank.gif" title="EVGA">
</img></a>
are you happy with these extensions?
 type 'done' when happy
 or enter to change extension
:'

1 Ответ

0 голосов
/ 28 мая 2019

Если container является вашим BeautifulSoup объектом, то eval('container.a') вернет список всех тегов <a>. Использование eval или exec, вероятно, не очень хорошая идея в вашем случае, однако см. Почему следует избегать exec () и eval ()?
Вместо этого я рекомендую использовать find_all и его параметр attrs, хотя анализ входных данных, вероятно, окажется намного сложнее, чем вы ожидаете в настоящее время.

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