Красивый суп для поиска и регулярных выражений. Заменить текст «не в пределах <a></a>» - PullRequest
2 голосов
/ 20 июля 2011

Я использую Beautiful Soup для анализа html-кода, чтобы найти весь текст, который

1.Не содержится внутри каких-либо якорных элементов

Я пришел с этим кодом, который находит все ссылки внутри hrefно не наоборот.

Как я могу изменить этот код, чтобы с помощью Beautiful Soup получать только простой текст, чтобы я мог найти, заменить и изменить суп?

for a in soup.findAll('a',href=True):
    print a['href']

РЕДАКТИРОВАТЬ:

Пример:

<html><body>
 <div> <a href="www.test1.com/identify">test1</a> </div>
 <div><br></div>
 <div><a href="www.test2.com/identify">test2</a></div>
 <div><br></div><div><br></div>
 <div>
   This should be identified 

   Identify me 1 

   Identify me 2 
   <p id="firstpara" align="center"> This paragraph should be<b> identified </b>.</p>
 </div>
</body></html>

Выход:

This should be identified 
Identify me 1 
Identify me 2
This paragraph should be identified.

Iя делаю эту операцию, чтобы найти текст не в <a></a>: затем найдите «Identify» и замените операцию на «Replaced»

Таким образом, конечный результат будет выглядеть так:

<html><body>
 <div> <a href="www.test1.com/identify">test1</a> </div>
 <div><br></div>
 <div><a href="www.test2.com/identify">test2</a></div>
 <div><br></div><div><br></div>
 <div>
   This should be identified 

   Repalced me 1 

   Replaced me 2 
   <p id="firstpara" align="center"> This paragraph should be<b> identified </b>.</p>
 </div>
</body></html>

Спасибо за ваше время!

1 Ответ

3 голосов
/ 20 июля 2011

Если я правильно вас понял, вы хотите получить текст внутри элемента, который содержит атрибут href.Если вы хотите получить текст элемента, вы можете использовать атрибут .text.

>>> soup = BeautifulSoup.BeautifulSoup()
>>> soup.feed('<a href="http://something.com">this is some text</a>')
>>> soup.findAll('a', href=True)[0]['href']
u'http://something.com'
>>> soup.findAll('a', href=True)[0].text
u'this is some text'

Редактировать

Находит все текстовые элементы с указанными в них:

>>> soup = BeautifulSoup.BeautifulSoup()
>>> soup.feed(yourhtml)
>>> [txt for txt in soup.findAll(text=True) if 'identified' in txt.lower()]
[u'\n   This should be identified \n\n   Identify me 1 \n\n   Identify me 2 \n   ', u' identified ']

Возвращенные объекты имеют тип BeautifulSoup.NavigableString.Если вы хотите проверить, является ли родительский элемент элементом a, вы можете сделать txt.parent.name == 'a'.

Еще одно редактирование:

Вот еще один пример с регулярным выражением и заменой.

import BeautifulSoup
import re

soup = BeautifulSoup.BeautifulSoup()
html = '''
<html><body>
 <div> <a href="www.test1.com/identify">test1</a> </div>
 <div><br></div>
 <div><a href="www.test2.com/identify">test2</a></div>
 <div><br></div><div><br></div>
 <div>
   This should be identified 

   Identify me 1 

   Identify me 2 
   <p id="firstpara" align="center"> This paragraph should be<b> identified </b>.</p>
 </div>
</body></html>
'''
soup.feed(html)
for txt in soup.findAll(text=True):
    if re.search('identi',txt,re.I) and txt.parent.name != 'a':
        newtext = re.sub(r'identi(\w+)', r'replace\1', txt.lower())
        txt.replaceWith(newtext)
print(soup)


<html><body>
<div> <a href="www.test1.com/identify">test1</a> </div>
<div><br /></div>
<div><a href="www.test2.com/identify">test2</a></div>
<div><br /></div><div><br /></div>
<div>
   this should be replacefied 

   replacefy me 1 

   replacefy me 2 
   <p id="firstpara" align="center"> This paragraph should be<b> replacefied </b>.</p>
</div>
</body></html>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...