2013-04-20 1 views
0

Я пытаюсь сделать две вещи с Beautiful Soup:Как лишить персонажей, мешающих Beautiful Soup, возвращать ссылки с указанным текстом?

  1. найти и печать дивы с определенным классом
  2. Найти и напечатать ссылки, которые содержат определенный текст

Первая часть работает. Вторая часть возвращает пустой список, то есть []. В попытке устранить это, я создал следующее, который работает как задумано:

from bs4 import BeautifulSoup 

def my_funct(): 
    content = "<div class=\"class1 class2\">some text</div> \ 
     <a href='#' title='Text blah5454' onclick='blahblahblah'>Text blah5454</a>" 
    soup = BeautifulSoup(content) 
    thing1 = soup("div", "class1 class2") 
    thing2 = soup("a", text="Text") 
    print thing1 
    print thing2 

my_funct() 

Посмотрев на источник исходного содержания (в моей фактической реализации) в SciTE редакторе. Тем не менее, одна разница в том, что есть LF и четыре -> «s на новой линии между Text и blah5454 в тексте ссылки, например:

Enter image description here

И поэтому я думаю, что причина того, что я я получаю пустой [].

Мои вопросы:

  1. Является ли это вероятной причиной?
  2. Если это так, это лучшее решение для «разметки» этих символов, и если да, то что это лучший способ сделать это?

ответ

3

text соответствует только В параметре по содержанию текста весь. Вы должны использовать регулярное выражение вместо:

import re 

thing2 = soup("a", text=re.compile(r"\bText\b")) 

Граничные якоря \b слова убедитесь, что вы только сопрягать слово целиком, а не частичное слово. Имейте в видунеобработанный строковый литерал, используемый здесь, \b означает что-то разные при интерпретации как нормальная строка; вам придется удвоить обратную косую черту, если вы не используете здесь строковый литерал.

Демо:

>>> from bs4 import BeautifulSoup 
>>> content = "<div class=\"class1 class2\">some text</div> \ 
...   <a href='#' title='wooh!' onclick='blahblahblah'>Text blah5454</a>" 
>>> soup = BeautifulSoup(content) 
>>> soup("a", text='Text') 
[] 
>>> soup("a", text=re.compile(r"\bText\b")) 
[<a href="#" onclick="blahblahblah" title="wooh!">Text blah5454</a>] 
+0

большое спасибо, что работал, привет. – user1063287