Python解析

2024-10-02 00:19:50 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图将rss2.0提要中的title标记解析为该提要中每个条目的三个不同变量。使用ElementTree,我已经解析了RSS,这样我就可以用下面的代码打印每个标题[减去后面的)]:

feed = getfeed("http://www.tourfilter.com/dallas/rss/by_concert_date")

for item in feed:  
 print repr(item.title[0:-1])

我把它包括在内是因为,正如你所看到的项目名称是一个repr()数据类型,我对此不太了解。在

交互窗口中的特定repr(item.title[0:-1])printed如下所示:

'randy travis (Billy Bobs 3/21'
'Michael Schenker Group (House of Blues Dallas 3/26'

用户选择一个波段,我希望在将每个item.title解析为3个变量(分别对应band、venture和date。。。或者可能是一个数组或者我不知道…)只选择与所选波段相关的那些。然后他们被发送到谷歌进行地理编码,但那是另一回事。在

我看过一些regex的例子,我正在读这些例子,但是看起来很复杂。它是?我想也许这里有人会对如何用一种聪明的方式做这件事有一些见解。我应该使用re模块吗?输出当前是repr()s有关系吗?有更好的方法吗?我在想我应该使用一个循环(这是我的pseudo python,就像我正在写的注释):


     list = bandRaw,venue,date,latLong  
     for item in feed:  
      parse item.title for bandRaw, venue, date  
       if bandRaw == str(band)   
        send venue name + ", Dallas, TX" to google for geocoding  
        return lat,long  
      list = list + return character + bandRaw + "," + venue + "," + date + "," + lat + "," + long  
     else  

最后,我需要在.csv(逗号分隔)文件中选择如下所示的条目:

band,venue,date,lat,long  
randy travis,Billy Bobs,3/21,1234.5678,1234.5678  
Michael Schenker Group,House of Blues Dallas,3/26,4321.8765,4321.8765

我希望这个要求不过分。我会自己调查的,只是想我应该在这里发帖,以确保它得到答复。在

所以,问题是,如何最好地将feed中的每个repr(item.title[0:-1])解析为3个独立的值,然后将它们连接到一个.csv文件中?在


Tags: inforbanddatetitlefeeditemlong
3条回答

关于repr(item.title[0:-1])部分,不确定您是从哪里得到的,但是我很确定您可以简单地使用item.title。您所要做的就是从字符串中删除最后一个字符,然后对其调用repr(),但什么都不做。在

您的代码应该如下所示:

import geocoders # from GeoPy
us = geocoders.GeocoderDotUS()

import feedparser # from www.feedparser.org
feedurl = "http://www.tourfilter.com/dallas/rss/by_concert_date"
feed = feedparser.parse(feedurl)

lines = []
for entry in feed.entries:
    m = re.search(r'(.*) \((.*) (\d+/\d+)\)', entry.title)  
    if m:
        bandRaw, venue, date = m.groups()

        if band == bandRaw:
            place, (lat, lng) = us.geocode(venue + ", Dallas, TX")
            lines.append(",".join([band, venue, date, lat, lng]))

result = "\n".join(lines)

编辑:将list替换为lines作为变量名。list是一个内置项,不应用作变量名。对不起的。在

别让正则表达式吓跑你。。。这很值得学习。在

根据上面的示例,您可以尝试将尾部括号放回,然后使用以下模式:

import re
pat = re.compile('([\w\s]+)\(([\w\s]+)(\d+/\d+)\)')
info = pat.match(s)
print info.groups()

('Michael Schenker Group ', 'House of Blues Dallas ', '3/26')

要获取每个组的个体,只需在info对象上调用它们:

^{pr2}$

在这种情况下,regex的难点在于确保知道标题中所有已知的可能字符。如果“Michael Schenker Group”部分中有非alpha字符,则必须调整该部分的regex以允许它们。在

上面的模式分解如下,从左到右进行解析:

([\w\s]+):匹配任何单词或空格字符(加号表示应该有一个或多个这样的字符)。括号表示匹配项将作为一个组捕获。这是“迈克尔·申克集团”的一部分。如果这里可以有数字和破折号,您需要修改方括号之间的部分,这是集合的可能字符。在

\(:文字括号。反斜杠将转义圆括号,因为否则它将被视为正则表达式命令。这是字符串的“(”部分。在

([\w\s]+):与上面的一样,但这次匹配的是“达拉斯蓝军之家”部分。在括号中,这样他们将被捕获为第二组。在

^ {CD5>}:将数字3和26与中间的斜线匹配。在括号中,这样他们将被捕获为第三组。在

\):上面的右括号。在

python对regex的介绍相当不错,您可能需要花一个晚上的时间来复习一下http://docs.python.org/library/re.html#module-re。另外,查看divinto Python,它有一个友好的介绍:http://diveintopython3.ep.io/regular-expressions.html。在

编辑:见下面的扎切拉蒂,他有一些不错的编辑。两个脑袋总比一个好!在

正则表达式是解决此问题的一个很好的解决方案:

>>> import re
>>> s  = 'Michael Schenker Group (House of Blues Dallas 3/26'
>>> re.match(r'(.*) \((.*) (\d+/\d+)', s).groups()
('Michael Schenker Group', 'House of Blues Dallas', '3/26')

作为一个补充说明,您可能需要查看用于处理RSS解析的Universal Feed Parser,因为提要有一个格式错误的坏习惯。在

编辑

关于你的评论。。。字符串偶尔被包装成“s”而不是“s”与您使用repr这一事实有关。字符串的repr通常用s分隔,除非该字符串包含一个或多个s,否则它使用“s”,这样就不必转义了:

^{pr2}$

注意不同的引用样式。在

相关问题 更多 >

    热门问题