Beautiful Soup 查找隐藏样式的元素

7 投票
5 回答
18471 浏览
提问于 2025-04-17 08:43

我有个简单的问题。
我想知道如何找到当前在网页上不可见的元素。我猜想使用 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-selectors

2

使用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 封装 这一部分。

撰写回答