2014-02-17 2 views
0
places = [] 
persons = []  
unknown = [] 
newlist = [] 
filename = 'file.html' 
tree = etree.parse(filename) 
input_file = open(filename, 'rU') 
def extract(tree): 
    <some code> 
    return places 
    return persons 
    return unknown 

def change_class(): 
extract(tree) 

for line in input_file:   
    for x in places: 
     for z in unknown:                  

      if x+'</dfn>' in line: 

        newline = line.replace('"person"', '"place"') 
        newlist.append(newline) 

      elif z+'</dfn>' in line: 

        newline = line.replace('"person"','"undefined"') 
        newlist.append(newline) 
      else: 
       newlist.append(line) 

      break 
     break 

for x in newlist: 
    print x 

У меня есть HTML-файл этого рода со значениями ошибочными класса:Looping останавливается после первого элемента в списке

<html> 
    <head></head> 
    <body> 
    <p class ='person'><dfn>New-York</dfn> 
    <p class = 'place'><dfn>John Doe</dfn> 
    <p class ='person'><dfn>Paris</dfn> 
    <p class = 'place'><dfn>Jane Doe</dfn> 
    </body> 
</html> 

Мой сценарий позволяет мне перепечатывать тот же файл, но он заменяет значение класса только для первого элемента в обоих списках (места и неизвестно):

<html> 
    <head></head> 
    <body> 
    <p class ='place'><dfn>New-York</dfn> 
    <p class = 'unknown'><dfn>John Doe</dfn> 
    <p class ='person'><dfn>Paris</dfn> 
    <p class = 'place'><dfn>Jane Doe</dfn> 
    </body> 
</html> 

Затем он прекращает итерацию по обоим спискам и переходит непосредственно к другому шагу и добавляет все остальное в новый список без замены. Python yelds без ошибок, список успешно извлечены с помощью функции экстракта(), а также, я проверил ...

+0

Почему вы не используете регулярные выражения? –

+0

хорошо, что вы выходите из обеих внутренних петель без каких-либо условий. Так почему вы ожидаете более одного цикла? – M4rtini

+0

Где именно использовать их? – user3241376

ответ

1
known_places = #list of known places 
unkowns = #list of unknown places and persons 

newlist = [] 
for line in input_file: 
    if any(place in line for place in Known_places): 
     line = line.replace("person", "place") 
    elif any(unkown in line for unkown in unkowns): 
     line = line.replace("person","undefined") 
    newlist.append(line) 

Нечто подобное могло бы работать.

+0

СПАСИБО СОООО МНОГО! :) Это работает отлично! – user3241376

0

Я удалил свой другой ответ, так как он пытался решить проблему, которой у вас не было. Я вижу, вы уже приняли ответ, но посмотрите на решение BeautifulSoup.

from bs4 import BeautifulSoup 

PLACES = ["New-York","Paris"] # etc 
PEOPLE = ["John Doe","Jane Doe"] # etc 

soup = BeautifulSoup(open('file.txt')) 
paragraphs = soup("p") # grabs all the <p>...</p> elements 
for p in paragraphs: 
    if p.dfn.string in PLACES: 
     p['class'] = 'place' 
    elif p.dfn.string in PEOPLE: 
     p['class'] = 'person' 

str(soup) теперь ваш HTML документ, модифицированный в соответствии с просьбой.

+0

Спасибо за ваш ответ! Выглядит интересно, я никогда не использовал BeautifulSoup раньше ... – user3241376

+0

@elaine_blath BeautifulSoup - удивительный парсер для XML/HTML. Я все еще сам это изучаю, но приложения невероятны! :) –

Смежные вопросы