2014-10-04 5 views
0

Я пытаюсь найти тег usin bs4, где текст находится в формате: «Firma: ...........». Проблема в том, что re.compile не работает для этого вообще. Я не могу понять, что я делаю.re.compile не работает должным образом

Вот код HTML:

<span class="date"> 
    Firma: 
    <b>Agedr js</b> 
</span> 

Вот код, чтобы найти этот тег:

re.DOTALL 
attributes = soup.findAll('span', class_='date') 
     for attribute in attributes: 
      if attribute == re.compile('Firma: .*'): 
       firma = attribute.text 
       print firma 

Я полагаю, что я использую некоторые специальные символы в тексте «Фирма: «но я не могу найти его. Где может быть проблема?

EDIT: пути не работает:

Стараюсь re.compile('Firma.*').

re.DOTALL 

переключатель if attribute == ..., чтобы, если attribute.contents[0] == ...

ответ

1

Код сравнения скомпилированный объект шаблон с Tag объекта. Он всегда будет терпеть неудачу.

>>> import re 
>>> re.compile('a') == 'a' # PatternObject == str => always false 
False 
>>> re.compile('a').search('a') 
<_sre.SRE_Match object at 0x0000000002933168> 
>>> re.search('a', 'a') 
<_sre.SRE_Match object at 0x00000000029331D0> 

Вы должны использовать PatternObject.search (или re.search) с str (слегка измененный шаблон не включать пробел):

if re.compile('Firma:.*').search(attribute.text): 
    firma = attribute.text 
    print firma 

Но для этого простого случая, вам лучше использовать in оператора:

if 'Firma:' in attribute.text: 
    .... 
+0

О, я глуп, спасибо. Второй вариант, безусловно, будет работать. – Mill

+0

Я только что понял, что я забыл написать «.text» после переменной «attribute»: «attribute.text == re.compile (« Firma:. * »):« Это тоже не сработало. Но attribute.text - это насколько мне известно, поэтому он должен работать, но это не так. – Mill

+0

@Mill, Как я написал в ответе, это даст «Ложно». Регулярный шаблон выражения не предназначен для прямого сравнения с строкой с использованием '==' oeprator. Его следует сравнивать с помощью метода 'search',' match'. Или вы можете использовать 'findall',' finditer' для поиска совпадающих строк. – falsetru

Смежные вопросы