Beautiful Soup 查找隐藏样式的元素
我有个简单的问题。
我想知道如何找到当前在网页上不可见的元素。我猜想使用 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 结构,其中可能有元素被隐藏)
5 个回答
0
试试这个(bs4),对我有效:
print soup1.select( '[style~="visibility:hidden"]' )
print soup1.select( '[style~="display:none"]' )
.select 方法使用的是 CSS2 选择器:
http://www.crummy.com/software/BeautifulSoup/bs4/doc/#css-selectors2
使用BeautifulSoup时,你需要明确检查哪些属性让这些元素变得不可见:
soup = BeautifulSoup(source)
tbi1 = soup.find(id='tbi1')
tbi2 = soup.find(id='tbi2')
print tbi1['style'] == 'visibility:hidden'
print tbi2['class'] == 'hidden_elements'
4
BeautifulSoup 是一个 HTML 解析器,而不是浏览器。它并不知道网页应该怎么显示,也不计算 DOM 属性等,它只是在检查尖括号的开始和结束位置。
如果你需要在运行时操作 DOM,使用浏览器自动化工具会更合适,也就是说,找一个可以启动浏览器的工具,让浏览器加载网页,然后提供浏览器控制和计算后的 DOM。根据你使用的平台,有不同的选择。可以看看 这个页面,里面有关于 Python 的一些想法,特别是 关于 Web "库" 和浏览器技术的 Python 封装 这一部分。