使用 BeautifulSoup 查找具有两种特定样式的标签

Posted

技术标签:

【中文标题】使用 BeautifulSoup 查找具有两种特定样式的标签【英文标题】:Using BeautifulSoup to find tag with two specific styles 【发布时间】:2016-05-10 11:20:14 【问题描述】:

我正在尝试使用 Python2.7 中的 BeautifulSoup (bs4) 包在 html 文档中查找以下标记:

<div style="position:absolute; border: textbox 1px solid; writing-mode:lr-tb; left:408px; top:540px; width:14px; height:9px;"><span style="font-family: OEULZL+ArialMT; font-size:9px">0.00<br></span></div>

在 html 文档中有多个几乎完全相同的其他标签 - 唯一一致的区别是“left:408px”和“height:9px”属性。

如何使用BeautifulSoup 找到这个标签?

我尝试了以下方法:

from bs4 import BeautifulSoup as bs

soup = bs("<div style="position:absolute; border: textbox 1px solid; writing-mode:lr-tb; left:408px; top:540px; width:14px; height:9px;"><span style="font-family: OEULZL+ArialMT; font-size:9px">0.00<br></span></div>", 'html.parser')

soup.find_all('div', style=('left:408px' and 'height:9px'))
soup.find_all('div', style=('left:408px') and style=('height:9px')) #doesn't like style being used twice
soup.find_all('div', 'left':'408px' and 'height':'9px')
soup.find_all('div', 'left:408px' and 'height:9px')
soup.find_all('div', style='left':'408px' and 'height':'9px')
soup.find_all('div', style='left:408px' and 'height:9px')

有什么想法吗?

【问题讨论】:

【参考方案1】:

您可以检查style 以在其中包含left:408pxheight:9px

soup.find('div', style=lambda value: value and 'left:408px' in value and 'height:9px' in value)

或者:

import re
soup.find('div', style=re.compile(r'left:408px.*?height:9px'))

或者:

soup.select_one('div[style*="408px"]')

请注意,一般而言,样式属性不能可靠地用于定位元素。查看是否还有其他内容 - 检查父元素、兄弟元素,或者元素附近是否有相应的标签。

请注意,更合适的 CSS 选择器是 div[style*="left:408px"][style*="height:9px"],但由于 limited CSS selector support 和 this bug,它不会按原样工作。

【讨论】:

谢谢!我喜欢正则表达式选项。不幸的是,我只坚持使用 CSS 样式元素。

以上是关于使用 BeautifulSoup 查找具有两种特定样式的标签的主要内容,如果未能解决你的问题,请参考以下文章

使用 BeautifulSoup 查找与特定关键字相关的链接

使用 BeautifulSoup 查找包含特定文本的 HTML 标签

div的BeautifulSoup子项

BeautifulSoup/Regex:从 href 中查找特定值

使用 BeautifulSoup 删除具有特定类的 div

查找带有 beautifulsoup 的特定链接