Python - 在两个标签之间获取单词

时间:2013-09-18 18:39:21

标签: python xml regex

我有这个字符串:

História do RFID A tecnologia de <EM ID="hub-30518" CATEG="PESSOA">RFID </EM>tem suas raízes nos sistemas de radares

我希望得到CATEG="(what I want to get)"之间和">(what I want to get)</EM>之间的内容,在这种情况下,结果将是PESSOARFID

我拥有的是

pega = re.sub(r'<[^C]*(CATEG="[^"]+")[^>]*>', r'<\1>', text)

但结果只是

  

História做RFID技术RFID&lt; temsuasraízesnossistemas de radares

我该怎么做?

7 个答案:

答案 0 :(得分:4)

您可以使用内置的迷你模块轻松解析它:

from xml.dom import minidom

xml = '<xml>História do RFID A tecnologia de <EM ID="hub-30518" CATEG="PESSOA">RFID </EM>tem suas raízes nos sistemas de radares</xml>'
dom = minidom.parseString(xml)
em = dom.getElementsByTagName('EM')[0]
categ = em.getAttribute('CATEG')
text = " ".join(t.nodeValue for t in em.childNodes if t.nodeType == t.TEXT_NODE)

使用内置ElementTree模块的一种不那么冗长的方式:

from xml.etree import ElementTree

xml = '<xml>História do RFID A tecnologia de <EM ID="hub-30518" CATEG="PESSOA">RFID </EM>tem suas raízes nos sistemas de radares</xml>'
tree = ElementTree.fromstring(xml)
em = tree.find('EM')
categ = em.attrib['CATEG']
text = em.text

答案 1 :(得分:2)

这是使用beautifulsoup的解决方案:

# -*- coding: utf-8 -*-
from bs4 import BeautifulSoup
soup = BeautifulSoup('''História do RFID A tecnologia de <EM ID="hub-30518" CATEG="PESSOA">RFID </EM>tem suas raízes nos sistemas de radares''')
print soup.em['id']
print soup.em['categ']

您将注意到这是第二个最简洁的解决方案,也是最易于维护的解决方案,因为没有复杂的表达式需要理解。

答案 2 :(得分:1)

没有更多信息,很难说。以下内容可能过于具体,无法满足您的需求,但它可以满足您的要求。希望它至少会让你开始。

#!/usr/bin/python                                                               
# -*- coding: utf-8 -*-                                                         

import re

text='História do RFID A tecnologia de <EM ID="hub-30518" CATEG="PESSOA">RFID </EM>tem suas raízes nos sistemas de radares'

m = re.compile(r'CATEG="([^"]*)">([^>]*)</')
result = m.search(text)

print result.groups()

输出是:

('PESSOA', 'RFID ')

答案 3 :(得分:1)

尝试使用re.search

>>> result = re.search(r'CATEG="([^"]+)"[^>]*>([^<]+)', text)
>>> print result.group(1)
PESSOA
>>> print result.group(2)
RFID 

regex101 demo

ideone demo

不要只打印result因为它是python中的对象。您需要将它们打印为字符串,因此,您使用.group()(如果在括号内放置一个整数n,则会得到n捕获组。

答案 4 :(得分:1)

拆分功能可能是解决此问题的简单方法

s = "História do RFID A tecnologia de <EM ID="hub-30518" CATEG="PESSOA">RFID </EM>tem suas raízes nos sistemas de radares"
# FOR PESSOA
t1 = s.split("CATEG=\"")[1]
t1 = t1.split("\"")[0]    
# FOR RFID
t2 = s.split(" </EM>")[0]
t2 = t2.split(">")[1]
print t1,t2

答案 5 :(得分:0)

r'.*?<EM.*?CATEG="(.*?)".*?>(.*?)<//EM>.*?'

那就行了。 group(1)将是你的分类,而group(2)将是你的标记词。

答案 6 :(得分:0)

如果您愿意,您可以使用标准库 HTMLParser 不是最佳选项,但可能很有趣):

#!/usr/bin/env python
# -*- coding: utf-8 -*- 
from HTMLParser import HTMLParser

class MyHTMLParser(HTMLParser):

    data = ""
    search_tag = None
    search_attr = None
    attr = None
    grab_data = False

    def to_dict(self, attrs):
        ret = {}
        for k, v in attrs: ret[k] = v
        return ret

    def feed(self, data, tag, attr):

        self.search_tag = tag
        self.search_attr = attr
        HTMLParser.feed(self, data)

    def handle_starttag(self, tag, attrs):

        attrs = self.to_dict(attrs)
        if tag == self.search_tag:
            if self.search_attr in attrs:
                self.attr = attrs[self.search_attr]
            self.grab_data = 1

    def handle_data(self, data):

        if self.grab_data:
            self.data = data

    def handle_endtag(self, tag):

        if tag == self.search_tag:
            self.grab_data = 0

xml = u'História do RFID A tecnologia de <EM ID="hub-30518" CATEG="PESSOA">RFID </EM>\
                                                tem suas raízes nos sistemas de radares'

parser = MyHTMLParser()
parser.feed(xml, "em", "categ")
print parser.data, parser.attr