Удалить escape-последовательности из разобранного HTML

0

Я использую модуль mechanize Python для отправки простого запроса на веб-сайт, а затем разбиваю возвращаемые элементы, чтобы получить нужные мне данные. Но я не могу правильно обработать escape-последовательности, которые передаются обратно. здесь мой код:

def stripEscape(string):    #credit goes to sarnold
    delete = ""
    i=1
    while (i<0x20):
        delete += chr(i)
        i += 1
    t = string.translate(None, delete)
    return t

def getHTML(metID):
    br = mechanize.Browser()
    response = br.open("http://urlgoeshere.com")

    br.form = list(br.forms())[0]
    br["PROMPT12"] = metID

    response = br.submit()
    htmlText = response.read()
    parseHTML(htmlText)

def parseHTML(htmlText):
    htmlText.index('table')
    arr = re.split(r'(</?\w{2}>)',htmlText)   # everything after background tag 
    logFile = open('Log.txt','wb')

    for ele in arr:
        ele = stripEscape(ele)
        if ele == '':
            arr.remove(ele)

    for ele in arr:
        logFile.write("ele: "+ele+'\n') 
        if re.match('/table', ele):
            logFile.write("END OF TABLE FOUND")
            logFile.write("\nele: "+ele+'\n')
            break
        # other element filters

Функция stripEscape работает очень хорошо, когда я передаю ее аргументы через интерактивную оболочку, но один из элементов массива с сайта - \r\n</table>\r\n, и это "экранирует" мои фильтры. Он записывается в мой файл журнала так:

ele: normal
ele: stuff
ele: 
</table>

ele: more
ele: normal

Тег закрывающей таблицы, минуя фильтр, заставляет все мои другие фильтры сглаживаться. Есть ли лучший способ обработки escape-последовательностей?

Теги:
escaping
mechanize

1 ответ

1
Лучший ответ

Элемент ele в первом цикле не сохраняется в массиве.

for ele in arr:
    ele = stripEscape(ele)
    if ele == '':
        arr.remove(ele)

Эта часть кода будет меняться только ele элемент не является arr. arr останется неизменным. Таким образом, все escape-последовательности НЕ будут удалены. Вы можете проверить его, напечатав arr после этого цикла.

Поэтому вам нужно сохранить его как новый массив, который затем может использоваться следующим циклом. Это может быть примерно так:

for ele in arr:
    if ele != "":
        newArray.append(stripEscape(ele))


for ele in newArray:
    logFile.write("ele: "+ele+'\n') 
    if re.match('/table', ele):
        logFile.write("END OF TABLE FOUND")
        logFile.write("\nele: "+ele+'\n')
        break
  • 0
    Определенно момент лицевой стороны лица. Должен был увидеть это.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню