Красивый Суп найти элементы, имеющие скрытый стиль - PullRequest
3 голосов
/ 20 декабря 2011

Моя простая потребность. Как найти элементы, которые в данный момент не видны на веб-странице? Я предполагаю, style="visibility:hidden" или style="display:none" - это простые способы скрыть элемент, но BeautifulSoup не знает, скрыт он или нет.

Например, HTML это:

Textbox_Invisible1: <input id="tbi1" type="text" style="visibility:hidden">
Textbox_Invisible2: <input id="tbi2" type="text" class="hidden_elements">
Textbox1: <input id="tb1" type="text">

Итак, первое, что меня беспокоит, это то, что BeautifulSoup не может выяснить, скрыты ли какие-либо из указанных выше текстовых полей:

# Python 2.7
# Import BeautifulSoup
>>> source = """Textbox_Invisible1: <input id="tbi1" type="text" style="visibility:hidden">
...  Textbox_Invisible2: <input id="tbi2" type="text" class="hidden_elements">
...  Textbox1: <input id="tb1" type="text">"""
>>> soup1 = BeautifulSoup(source)
>>> soup1.find(id='tb1').hidden
False
>>> soup1.find(id='tbi1').hidden
False
>>> soup1.find(id='tbi2').hidden
False
>>> 

Мой единственный вопрос: есть ли способ узнать, какие элементы скрыты? (Мы также должны рассмотреть сложный HTML, в котором скрытые элементы могут быть скрыты)

Ответы [ 3 ]

3 голосов
/ 07 января 2012

BeautifulSoup - это html-парсер , а не браузер.Он ничего не знает о том, как страница должна отображаться, вычисляются атрибуты DOM и т. Д., Он проверяет, где угловые скобки начинаются и заканчиваются.

Если вам нужно работать с DOM во время выполнения, вы 'Лучше было бы воспользоваться пакетом автоматизации браузера, то есть тем, что запустит браузер, позволит браузеру поглотить страницу, а затем предоставит элементы управления браузером и вычисленный DOM.В зависимости от платформы у вас есть разные варианты.Взгляните на эту страницу в Python WIki за идеями, проверьте раздел Оболочки Python вокруг веб-"Библиотеки" и технологии браузера .

2 голосов
/ 20 декабря 2011

Боюсь, что с BeautifulSoup вам нужно явно проверить атрибуты, используемые для скрытия элементов:

soup = BeautifulSoup(source)
tbi1 = soup.find(id='tbi1')
tbi2 = soup.find(id='tbi2')
print tbi1['style'] == 'visibility:hidden'
print tbi2['class'] == 'hidden_elements'
0 голосов
/ 25 июля 2013

попробуйте это (bs4), у меня работает:

print soup1.select( '[style~="visibility:hidden"]' )
print soup1.select( '[style~="display:none"]' )

.select метод, используемый CSS2 селекторами: http://www.crummy.com/software/BeautifulSoup/bs4/doc/#css-selectors

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