python匹配后得到下一行

时间:2017-01-13 08:25:36

标签: python filtering

我需要从第download GIS "Panorama"页获取有关软件版本和构建数据的信息(也可能是加载文件名) 我正在使用python和抓取。现在我有这样的sctript:

from grab import Grab
g = Grab(log_file='out.html')
g.go('http://www.gisinfo.ru/download/download.htm')
for table in g.doc.select('//div[@id="article_header_rubric"]/following-sibling::table[2]'):
#if test.text().startswith('Профессиона'):
 for tr in table.select('tr'):
  type(tr.select('td'))
  for td in tr.select('td'):
   #if td.text().startswith('Профессиональная ГИС'):
   print (td.text())

结果是这样的:

Драйвер электронного ключа x86 (версия 6.20, 32-разрядные операционные системы,
для Панорама 10 и выше)
15.08.2013
9,6 Mb
drivers.zip

Сервер Guardant Net (версия 5.5.0.10, для Панорама 10 и 11)
25.07.2013
4.1 Mb
gnserver.zip

Сервер Guardant Net (версия 6.3.1.713, для Панорама 12)
11.10.2016
4 Mb
netkey6.zip

Программа для диагностики ключей
13.07.2016
2,6 Mb
diagnostics.zip

比我过滤我想要的东西:

from grab import Grab
g = Grab(log_file='out.html')
g.go('http://www.gisinfo.ru/download/download.htm')
for table in g.doc.select('//div[@id="article_header_rubric"]/following-sibling::table[2]'):
#if test.text().startswith('Профессиона'):
 for tr in table.select('tr'):
  type(tr.select('td'))
  for td in tr.select('td'):
   if td.text().startswith('Профессиональная ГИС'):
    print (td.text())

现在结果:

Профессиональная ГИС
Профессиональная ГИС "Панорама" (версия 12.4.0, для платформы "x64")
Профессиональная ГИС "Панорама" (версия 12.3.2, для платформы "x64", на английском языке)
Профессиональная ГИС "Карта 2011" (версия 11.13.5.7)

但我想要这样的结果:

Профессиональная ГИС "Панорама" (версия 12.4.0, для платформы "x64")
29.12.2016
347 Mb
panorama12x64.zip

Профессиональная ГИС "Панорама" (версия 12.3.2, для платформы "x64", на английском языке)
24.11.2016
376 Mb
panorama12x64en.zip

Профессиональная ГИС "Карта 2011" (версия 11.13.5.7)
11.01.2017
263 Mb
panorama11.zip

和想法?

2 个答案:

答案 0 :(得分:0)

tr.select('td')返回一个可迭代的。在当前代码中,您在每次迭代时测试字符串,因此您只打印第一个字符串。

您应该存储一个迭代器,获取它的第一个值并对其进行测试,如果匹配则打印来自iterable的所有值:

 for tr in table.select('tr'):
  type(tr.select('td'))
  it = iter(tr.select('td'))
  td = next(it)      # process first field in row
  if td.text().startswith('Профессиональная ГИС'):
    print (td.text())
    for td in it:    # print remaining fields
      print(td.text())

答案 1 :(得分:0)

对我来说是这样的:

from grab import Grab
g = Grab(log_file='out.html')
g.go('http://www.gisinfo.ru/download/download.htm')
list = []
for table in g.doc.select('//div[@id="article_header_rubric"]/following-sibling::table[2]'):
 for tr in table.select('tr'):
  type(tr.select('td'))
  for td in tr.select('td'):
    list.append(td.text())
for i in list:
 indexi=list.index(i)
 if (i.startswith('Профессиональная ГИС "Панорама" (версия 12') and i.endswith('x64")')):
  panorama12onsite = list[indexi]
  panorama12onsitedata = list[indexi+1]
 elif i.startswith('Профессиональная ГИС "Карта 2011"'):
  panorama11onsite = list[indexi]
  panorama11onsitedata = list[indexi+1]
 elif (i.startswith('Профессиональный векторизатор "Панорама-редактор" (версия 12') and i.endswith('x64")')):
  panedit12onsite = list[indexi]
  panedit12onsitedata = list[indexi+1]
 elif i.startswith('Профессиональный векторизатор "Панорама-редактор" (версия 11'):
  panedit11onsite = list[indexi]
  panedit11onsitedata = list[indexi+1]
  print (panorama12onsite)
  print (panorama12onsitedata)
  print (panorama11onsite)
  print (panorama11onsitedata)
  print (panedit12onsite)
  print (panedit12onsitedata)
  print (panedit11onsite)
  print (panedit11onsitedata)

现在我可以在脚本的其他部分使用此变量(合并vs下载版本并下载新版本,如果存在)。谢谢大家的帮助