使用 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:408px
和height: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 标签