Python Regex - 从XML文件中检索

时间:2017-05-15 04:53:16

标签: python regex

我目前遇到正则表达式问题。我正在尝试从XML文件中提取项目的名称:https://www.crimezappers.com/rss/catalog/category/cid/97/store_id/1/。我找到了一种方法,然而,它非常笨重,我想知道是否有办法让表达式更小?

这就是我现在所拥有的(很长的路):<item>\n<title>\n<!\[CDATA\[ ([A-Za-z].[^\]]+)|<item>\n<title>\n<!\[CDATA\[\n([A-Za-z].[^\]]+)

这是我尝试这样做的:<item>\n<title>\n<!\[CDATA\[|(?\n)| |([A-Za-z].[^\]]+)

Image of what should be found, the blue underline is what should be also found

先谢谢。

1 个答案:

答案 0 :(得分:2)

使用正则表达式来解析xml不是一个好主意。

使用像lxml这样的xml处理库:

>>> import requests
>>> import lxml.etree
>>> 
>>> r = requests.get('https://www.crimezappers.com/rss/...')
>>> root = lxml.etree.fromstring(r.content)
>>> root.xpath('//item/title/text()')
['Electrical Box HD Hidden Camera with Built in DVR',
 'Mini Clip On Smiley Face Button Spy Hidden Camera with Built in DVR',
 ...]

更新使用正则表达式。

您可以使用\s匹配任何空格字符(包括换行符\n):

>>> re.findall(r'<item>\s*<title>\s*<!\[CDATA\[\s*(.*?)\s*\]\]>', r.content)
['Electrical Box HD Hidden Camera with Built in DVR',
 'Mini Clip On Smiley Face Button Spy Hidden Camera with Built in DVR',
 ...]
  • [A-Za-z].[^\]]+替换为(.*?)\]\]>以匹配<![CDATA]]>之间的所有内容,非贪婪(?)。