2012-05-09 5 views
4

У меня есть некоторые XML:BeautifulSoup FindAll

<article> 
<uselesstag></uslesstag> 
<topic>oil, gas</topic> 
<body>body text</body> 
</article> 

<article> 
<uselesstag></uslesstag> 
<topic>food</topic> 
<body>body text</body> 
</article> 

<article> 
<uselesstag></uslesstag> 
<topic>cars</topic> 
<body>body text</body> 
</article> 

Есть много, много бесполезных тегов. Я хочу использовать beautifulsoup, чтобы собрать весь текст в тегах тела и связанный с ним текст темы, чтобы создать новый xml.

Я новичок в Python, но я подозреваю, что некоторые формы

import arff 
from xml.etree import ElementTree 
import re 
from StringIO import StringIO 

import BeautifulSoup 
from BeautifulSoup import BeautifulSoup 

totstring="" 

with open('reut2-000.sgm', 'r') as inF: 
    for line in inF: 
     string=re.sub("[^0-9a-zA-Z<>/\s=!-\"\"]+","", line) 
    totstring+=string 


soup = BeautifulSoup(totstring) 

body = soup.find("body") 



for anchor in soup.findAll('body'): 
    #Stick body and its topics in an associated array? 




file.close 

будет работать.

1) Как мне это сделать? 2) Должен ли я добавить корневой узел в XML? иначе это не правильный XML-это?

Большое спасибо

Edit:

Что я хочу, чтобы в конечном итоге это:

<article> 
<topic>oil, gas</topic> 
<body>body text</body> 
</article> 

<article> 
<topic>food</topic> 
<body>body text</body> 
</article> 

<article> 
<topic>cars</topic> 
<body>body text</body> 
</article> 

Есть много, много бесполезных теги.

+0

так, как вы хотите получить содержание от метки A, B, C или получить все содержимое тегов, игнорируя теги D, E, F? –

+0

Да, я хочу два типа тегов (тело и тема) и игнорировать другие вещи (дата, время и т. Д.) –

ответ

8

ok. вот решение,

первый, убедитесь, что у тебя было «beautifulsoup4» установлено: http://www.crummy.com/software/BeautifulSoup/bs4/doc/#installing-beautiful-soup

вот мой код, чтобы получить все тело и темы Теги:

from bs4 import BeautifulSoup 
html_doc= """ 
<article> 
<topic>oil, gas</topic> 
<body>body text</body> 
</article> 

<article> 
<topic>food</topic> 
<body>body text</body> 
</article> 

<article> 
<topic>cars</topic> 
<body>body text</body> 
</article> 
""" 
soup = BeautifulSoup(html_doc) 

bodies = [a.get_text() for a in soup.find_all('body')] 
topics = [a.get_text() for a in soup.find_all('topic')] 
+0

Эй, спасибо за помощь, @Arthur Neves, но я получаю Traceback (последний последний звонок): Файл " convert.py», строка 23, в тел = [a.get_text() для в soup.find_all ('тело')] TypeError: объект '' NoneType не отозваны не мне нужно определить? –

+0

для меня это работает отлично. попробуйте это: curl https://raw.github.com/gist/2646540/129f95c11cffa159daeec184ba47a57217379060/convert.py> convert.py; python convert.py –

+0

от bs4 сделал это для меня (d'oh) –

1

Другой способ удалить пустой Теги xml или html - использовать рекурсивную функцию для поиска пустых тегов и удаления их с помощью .extract(). Таким образом, вам не нужно вручную указывать те теги, которые вы хотите сохранить. Он также позволяет очищать пустые теги, которые вложены.

from bs4 import BeautifulSoup 
import re 
nonwhite=re.compile(r'\S+',re.U) 

html_doc1=""" 
<article> 
<uselesstag2> 
<uselesstag1> 
</uselesstag1> 
</uselesstag2> 
<topic>oil, gas</topic> 
<body>body text</body> 
</article> 

<p>21.09.2009</p> 
<p> </p> 
<p1><img src="http://www.www.com/"></p1> 
<p></p> 

<!--- This article is about cars---> 
<article> 
<topic>cars</topic> 
<body>body text</body> 
</article> 
""" 

def nothing_inside(thing): 
    # select only tags to examine, leave comments/strings 
    try: 
     # check for img empty tags 
     if thing.name=='img' and thing['src']<>'': 
      return False 
     else: 
      pass 
     # check if any non-whitespace contents 
     for item in thing.contents: 
      if nonwhite.match(item): 
       return False 
      else: 
       pass 
     return True 
    except: 
     return False 

def scrub(thing): 
    # loop function as long as an empty tag exists 
    while thing.find_all(nothing_inside,recursive=True) <> []: 
     for emptytag in thing.find_all(nothing_inside,recursive=True): 
      emptytag.extract() 
      scrub(thing) 
    return thing 

soup=BeautifulSoup(html_doc1) 
print scrub(soup) 

Результат:

<article> 

<topic>oil, gas</topic> 
<body>body text</body> 
</article> 
<p>21.09.2009</p> 

<p1><img src="http://www.www.com/"/></p1> 

<!--- This article is about cars---> 
<article> 
<topic>cars</topic> 
<body>body text</body> 
</article>