beautifulsoup findall

beautifulsoup, python, xml

Solution

ok. here is the solution,

first, make sure that u had 'beautifulsoup4' installed: http://www.crummy.com/software/BeautifulSoup/bs4/doc/#installing-beautiful-soup

here is my code to get all body and topic tags:

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')]

Problem

I have some xml: ``` <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> ``` There are many, many useless tags. I want to use beautifulsoup to collect all of the text in the body tags and their associated topic text to create some new xml. I am new to python, but I suspect that some form of ``` 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 ``` will work. 1) How do I do it? 2) Should I add a root node to the XML? otherwise it's not proper XML is it? Thanks very much Edit: What i want to end up with is: ``` <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> ``` There are many, many useless tags.

Original source