如何通过样式选择html标签?借助Beautifulsoup和Python

时间:2018-10-08 13:31:33

标签: python html beautifulsoup

所以我可能有一个标签,例如:

<p class=MsoNormal style='margin-top:0cm;margin-right:5.5pt;margin-bottom:.6pt;
margin-left:2.05pt'>bla bla bla</p>

我希望能够按margin-right:5pt

进行选择

请提取具有这种样式的任何标签。

目前,我有以下代码,但未提取任何内容:

p_tag = name.find_all('p', {'style':'margin-right:5.5pt'})
print(p_tag)

这里是我拥有的更多html代码:

<h1 style='margin-top:0cm;margin-right:1.75pt;margin-bottom:.25pt;margin- 
left:-.25pt'>Some header tag </h1>

<p class=MsoNormal style='margin:0cm;margin-bottom:.0001pt;text-indent:0cm;
line-height:107%'> </p>

<p class=MsoNormal style='margin-top:0cm;margin-right:5.5pt;margin-bottom:.6pt;
margin-left:2.05pt'>Some name<i>some place they work</i> 
</p>

<p class=MsoNormal style='margin-top:0cm;margin-right:0cm;margin-bottom:1.2pt;
margin-left:0cm;text-indent:0cm;line-height:107%'>  </p>

<p class=MsoNormal style='margin-top:0cm;margin-right:5.5pt;margin-bottom:.6pt;
margin-left:2.05pt'>short description about the person</p>

<p class=MsoNormal style='margin-top:0cm;margin-right:5.5pt;margin-bottom:4.5pt;
margin-left:2.05pt'>some more info...</p>

我可以合并所有带有特定边距的p标签,直到<h1>标签再次出现吗?

3 个答案:

答案 0 :(得分:1)

您使用的是完全匹配,但您打算进行部分匹配。尝试以下方法:

p_tag = name.find_all('p', {'style': lambda s: 'margin-right:5.5pt' in s})
print(p_tag)

答案 1 :(得分:0)

您可以使用if语句

from bs4 import BeautifulSoup
html = ''' <p class=MsoNormal style='margin-top:0cm;margin-right:5.5pt;margin-bottom:.6pt;margin-left:2.05pt'>bla bla bla</p>'''

soup = BeautifulSoup(html, 'html.parser')
p_tag = soup.find_all('p')[0]['style']
if 'margin-right:5.5pt' in p_tag:
    print(p_tag)
else:
    print('Not found')

输出:

margin-top:0cm;margin-right:5.5pt;margin-bottom:.6pt;margin-left:2.05pt

答案 2 :(得分:0)

BeautifulSoup对CSS selectors using the .select method有很好的支持。 CSS具有selecting elements based on attribute values的一些相当强大的方式。

在您的情况下,您希望选择具有属性style 包含 margin-right:5.5pt的元素,可以将其写为CSS选择器[style*='margin-right:5.5pt']

结合这些知识,可以为您的问题提供解决方案:

from bs4 import BeautifulSoup

html = '''
<p class=MsoNormal style='margin-top:0cm;margin-right:5.5pt;margin-bottom:.6pt;margin-left:2.05pt'>test1</p>
<p class=MsoNormal style='margin-top:0cm;margin-bottom:.6pt;margin-left:2.05pt'>test2</p>
<p class=MsoNormal style='margin-top:0cm;margin-right:5pt;margin-bottom:.6pt;margin-left:2.05pt'>test3</p>
'''
soup = BeautifulSoup(html)
[el.extract() for el in soup.select("[style*='margin-right:5.5pt']")]
print(soup.prettify())

哪个会给出以下输出:

<p class="MsoNormal" style="margin-top:0cm;margin-bottom:.6pt;margin-left:2.05pt">test2</p>
<p class="MsoNormal" style="margin-top:0cm;margin-right:5pt;margin-bottom:.6pt;margin-left:2.05pt">test3</p>