我有这个字符串:
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>
之间的内容,在这种情况下,结果将是PESSOA
和RFID
。
我拥有的是
pega = re.sub(r'<[^C]*(CATEG="[^"]+")[^>]*>', r'<\1>', text)
但结果只是
História做RFID技术RFID&lt; temsuasraízesnossistemas de radares
我该怎么做?
答案 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
不要只打印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