2012-07-26 41 views
3

其实我用scrapy解析一些HTML网页,我已经使用XPath和获取一些HTML标签的一些地址,结果是以下形式安排列表的字符串中所需的格式蟒蛇

result = ["Hno 4-50, Plot No 301, Swathi Pooja Homes,Beside Rajadhani Theater, Vikas Nagar,Dilsukhnagar,Hyderabad","Mr Sravan"] 

,我想加入的字符串,所以我不得不低于

final_result = ','.join(result) 

完成,得到以下结果

final_result = "Hno 4-50, Plot No 301, Swathi Pooja Homes,Beside Rajadhani Theater, Vikas Nagar,Dilsukhnagar,Hyderabad,Mr Sravan" 

在这里我们可以看到final_result(地址)Mr Sravan的名字在最后,但是通常名称应该在任何地方的任何联系人的门或门牌号码之前?因此,不管列表中的字符串数量是多少加入它我应该在开始时获得名称,有没有办法做到这一点?任何人都可以请让我知道如何做到这一点?

被修改代码:

目前我解析4个网址的时间,所以当我已经使用的xpath(或相关的),并从不同的URL中取出地址和结果(例如)是如下面每个URL

final_result = ['Addess_2','Newyork', 'Mr T.Jamal(Name)'] 
       ['Mr T. Jamal(Name)', 'Addres_1','Extra info'] 
       ['Addres_3','Mr T. Jamal(Name)','Extra info','Related scope'] 
       ['Addres_4','Extra info','Mr T. Jamal(Name)','Related info'] 
       ['Addres_5','Extra info','Related info'] # No name 
       ['Addres_6','Extra info1','Related info1'] # No name 

这里的解析地址的所有网址,希望编写上述

+0

如果 “先生” 是不在列表中应该发生什么?此外,这是对原来的问题的第三次有点不重要的变化..在某些时候,你可能想发布一个新的问题:) – Levon 2012-07-26 13:45:37

+0

好吧,这是最终的,我不会再改变这个问题,如果没有名字在该列表只需要打印剩余的字符串。 – 2012-07-26 13:49:28

回答

2

怎么是这样的:

final_result = result[-1] + ', ' + ''.join(result[:-1]) 

产生:

Mr Sravan, Hno 4-50, Plot No 301, Swathi Pooja Homes,Beside Rajadhani Theater, Vikas Nagar,Dilsukhnagar,Hyderabad 

- UPDATE -

这应该在原始列表中的任意位置找到“Mr”字符串,并使其按您希望的方式工作。

rs = ','.join(result).split(',') 
idx = [i for i,j in enumerate(rs) if j.strip().startswith('Mr')][0] 
final_result = (rs[idx] +',' + ','.join(rs[1:idx] + rs[idx+1:])).strip() 
print final_result 

这适用于通过OP在更新后提供

4条测试支路 - 更新2 OP改变的问题,让“先生”可能不在列表 -

该代码将检测Mr是否在列表中并将其移动到前面。它还会检测它是否不在列表中,并避免索引超出边界条件。见下面的输出。

测试字符串:

result = ['Addres_4','Extra info','Mr T. Jamal(Name)','Related info'] 
result = ['Addres_4','Extra info','T. Jamal(Name)','Related info'] 

代码:

rs = ','.join(result).split(',') 
idx = [i for i,j in enumerate(rs) if j.strip().startswith('Mr')] 

if len(idx) == 1: # we found "Mr" in the list 
    idx = idx[0] 
    final_result = (rs[idx] +',' + ','.join(rs[1:idx] + rs[idx+1:])).strip() 
else: # We didn't find "Mr" in the list .. adjust output to your needs 
    final_result = (','.join(rs).strip()) 

print final_result 

产量分别为:

Mr T. Jamal(Name),Extra info,Related info 
Addres_4,Extra info,T. Jamal(Name),Related info 
+0

如果我们不知道名称在列表中的位置,因为在获取名称时有时会在列表的中间,肯定名字以Mr – 2012-07-26 12:52:07

+0

@ shivakrishna开头我刚刚在你的4测试str上运行我的代码它的工作。 – Levon 2012-07-26 13:18:13

+0

@ Levon:哇,工作,非常感谢 – 2012-07-26 13:23:16

2

适用于所有列出的代码你可以做这样的:

final_result = ','.join(result[-1:] + result[:-1]) 


>>> 'Mr Sravan,Hno 4-50, Plot No 301, Swathi Pooja Homes,Beside Rajadhani Theater, Vikas Nagar,Dilsukhnagar,Hyderabad' 

编辑: 追随你的评论,如果你知道这个名字位于排名i,这是可以做到这样的:

result = ["is", "now", "the name", "at", "first", "place", ":)"] 
i = 2 
' '.join(result[i:i+1] + result[:i] + result[i+1:]) 
'the name is now at first place :)' 
+0

我认为,如果名称字符串位于列表的末尾,那么该名称是有效的,但如果名称在列表中乱码,我的意思是名称有时位于列表的中间,有时候位于末尾....所以无论如何,名称先生 – 2012-07-26 12:50:07

+0

我更喜欢你:) – Levon 2012-07-26 12:50:09

+1

@shivakrishna在你列举的例子中没有* middle *。它由两个字符串组成。那是一个错误吗? – kojiro 2012-07-26 12:52:50

1
def name_first(alist): 
    """Get the part of the list that begins with 'Mr', then the rest.""" 
    for i, el in enumerate(alist): 
     if el.startswith('Mr'): 
      yield alist.pop(i) 
      break 
    for el in alist: 
     yield el