2016-10-26 2 views
0

У меня есть HTML как:Как искать определенный текст в span в beautifulsoup?

<tr> 
<span id="ContentPlaceHolder1_grd_reminder_Label1_0">Engineering Mechanics</span> 
</tr> 
<tr> 
<span id="ContentPlaceHolder1_grd_reminder_Label1_2">Engineering Mechanics</span> 
</tr> 
... 

мой код для получения диапазона текста является:

trs = soup.find_all('tr') 
for tr in trs: 
    spans = tr.find_all('span') 
    if spans.id == "ContentPlaceHolder1_grd_reminder_Label***": 
     print spans.string 

В этой строке spans.id == "ContentPlaceHolder1_grd_reminder_Label***", я хочу, чтобы получить все идентификаторы, имеющие один и тот же текст в начале, но разные числа на последнем (как и выше, содержимое последнего - 1_0). Но мой код является ошибкой. Как я могу это решить?

ответ

0

Прежде всего, ваш текущий код не работает по нескольким причинам:

  • spans фактически ResultSet объект - список тегов, и это не имеет id атрибут
  • даже если spans был бы единственным экземпляром Tag, spans.id не принесет вам атрибута id - это на самом деле означает spans.find("id"), что привело бы к None. Чтобы получить значение атрибута Tag, использовать его как словарь, например: span["id"]
  • вы не можете сделать частичное совпадение с == и * в строке

Мы можем сделать лучше, и решить ее в очистителя путь в любом случае.


Проще всего сделать, это использовать "начинается с" CSS selector:

for elm in soup.select("span[id^=ContentPlaceHolder1_grd_reminder_Label]"): 
    print(elm.get_text()) 

Или, если через find_all(), вы можете либо использовать filtering function:

for elm in soup.find_all("span", id=lambda value: value and value.startswith("ContentPlaceHolder1_grd_reminder_Label"): 
    print(elm.get_text()) 

Или , a regular expression:

import re 

for elm in soup.find_all("span", id=re.compile("^ContentPlaceHolder1_grd_reminder_Label")): 
    print(elm.get_text()) 

где ^ обозначает начало строки.

+0

См. Отредактированный код вопроса. – slpcf

+0

@slpcf конечно, пожалуйста, см. Тот же ответ :) Я имею в виду, он не отвечает на вопрос? – alecxe

+0

Спасибо. Могу ли я использовать что-то вроде этого 'print (elm [2] .get_text())'? – slpcf

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