Extracting Text From Xml Using Python
I have this example xml file Chapter 1 Welcome to Chapter 1 Cha
Solution 1:
There is already a built-in XML library, notably ElementTree
. For example:
>>>from xml.etree import cElementTree as ET>>>xmlstr = """...<root>...<page>... <title>Chapter 1</title>... <content>Welcome to Chapter 1</content>...</page>...<page>... <title>Chapter 2</title>... <content>Welcome to Chapter 2</content>...</page>...</root>...""">>>root = ET.fromstring(xmlstr)>>>for page inlist(root):... title = page.find('title').text... content = page.find('content').text...print('title: %s; content: %s' % (title, content))...
title: Chapter 1; content: Welcome to Chapter 1
title: Chapter 2; content: Welcome to Chapter 2
Solution 2:
You can also try this code to extract texts:
from bs4 import BeautifulSoup
import csv
data ="""<page>
<title>Chapter 1</title>
<content>Welcome to Chapter 1</content>
</page>
<page>
<title>Chapter 2</title>
<content>Welcome to Chapter 2</content>
</page>"""
soup = BeautifulSoup(data, "html.parser")
########### Title #############
required0 = soup.find_all("title")
title = []
for i in required0:
title.append(i.get_text())
########### Content #############
required0 = soup.find_all("content")
content = []
for i in required0:
content.append(i.get_text())
doc1 = list(zip(title, content))
for i in doc1:
print(i)
Output:
('Chapter 1', 'Welcome to Chapter 1')
('Chapter 2', 'Welcome to Chapter 2')
Solution 3:
Code :
from xml.etree import cElementTree as ET
tree = ET.parse("test.xml")
root = tree.getroot()
for page in root.findall('page'):
print("Title: ", page.find('title').text)
print("Content: ", page.find('content').text)
Output:
Title: Chapter 1Content: Welcome to Chapter 1Title: Chapter 2Content: Welcome to Chapter 2
Solution 4:
I personally prefer parsing using xml.dom.minidom
like so:
In [18]: import xml.dom.minidom
In [19]: x = """\
<root><page>
<title>Chapter 1</title>
<content>Welcome to Chapter 1</content>
</page>
<page>
<title>Chapter 2</title>
<content>Welcome to Chapter 2</content>
</page></root>"""
In [28]: doc = xml.dom.minidom.parseString(x)
In [29]: doc.getElementsByTagName("page")
Out[30]: [<DOM Element: page at 0x94d5acc>, <DOM Element: page at 0x94d5c8c>]
In [32]: [p.firstChild.wholeText for p in doc.getElementsByTagName("title") if p.firstChild.nodeType == p.TEXT_NODE]
Out[33]: [u'Chapter 1', u'Chapter 2']
In [34]: [p.firstChild.wholeText for p in doc.getElementsByTagName("content") if p.firstChild.nodeType == p.TEXT_NODE]
Out[35]: [u'Welcome to Chapter 1', u'Welcome to Chapter 2']
In [36]: for node in doc.childNodes:
if node.hasChildNodes:
for cn in node.childNodes:
if cn.hasChildNodes:
for cn2 in cn.childNodes:
if cn2.nodeType == cn2.TEXT_NODE:
print cn2.wholeText
Out[37]: Chapter 1
Welcome to Chapter 1
Chapter 2
Welcome to Chapter 2
Solution 5:
Recommend you a simple library. Here's an example: https://github.com/yiyedata/simplified-scrapy-demo/tree/master/doc_examples
from simplified_scrapy.simplified_doc import SimplifiedDoc
html ='''
<page>
<title>Chapter 1</title>
<content>Welcome to Chapter 1</content>
</page>
<page>
<title>Chapter 2</title>
<content>Welcome to Chapter 2</content>
</page>'''
doc = SimplifiedDoc(html)
pages = doc.pages
print ([(page.title.text,page.content.text) for page in pages])
Result:
[('Chapter 1', 'Welcome to Chapter 1'), ('Chapter 2', 'Welcome to Chapter 2')]
Post a Comment for "Extracting Text From Xml Using Python"