Как выбрать тег HTML по его стилю?С Beautifulsoup и Python - PullRequest
0 голосов
/ 08 октября 2018

Так что у меня может быть тег, такой как:

<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 голосов
/ 08 октября 2018

Вы можете использовать оператор 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
0 голосов
/ 08 октября 2018

BeautifulSoup имеет неплохую поддержку селекторов CSS с использованием метода .select .У CSS есть несколько довольно мощных способов выбора элементов на основе значений атрибутов .

. В вашем случае вы хотите выбрать элементы с атрибутом 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>
0 голосов
/ 08 октября 2018

Вы используете точное совпадение, но вы намерены частичное совпадение.Попробуйте вместо этого:

p_tag = name.find_all('p', {'style': lambda s: 'margin-right:5.5pt' in s})
print(p_tag)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...