我目前遇到正则表达式问题。我正在尝试从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].[^\]]+)
先谢谢。
答案 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
和]]>
之间的所有内容,非贪婪(?
)。