Как разобрать строку в python

#python #parsing

#python #синтаксический анализ

Вопрос:

Без каких-либо сторонних библиотек (таких как beautiful soup), каков самый чистый способ анализа строки в PYTHON.

Учитывая приведенный ниже текст, я бы хотел, чтобы содержимое «uber_token» было проанализировано, т.Е. «123456789»

….

 <form id="blah" action="/p-submi.html" method="post"><input type="hidden" id="" name="uber_token" value="123456789"/><div class="container-info">
 

….

Спасибо!

Комментарии:

1. вам нужно маркировать все элементы и атрибуты или просто извлечь value="XXX" часть? Если это только последнее, используйте регулярное выражение.

2. просто нужно значение =»xxx». Но существует несколько экземпляров value=»**», которые могут иметь другое связанное имя.

3. Если атрибуты и их порядок согласованы в каждом элементе, вы можете использовать для этого регулярное выражение, но почему вы не хотите использовать библиотеку?

4. Обратите внимание, что если вам также нужны имена, которые сопровождают значения, возможно, обновите свой вопрос.

5. Если каждый <input type="hidden" id="" name="uber_token" value="123456789"/> из них равен одному на строку. Затем вы можете просто выбрать for name и проанализировать две цитаты после. Если она равна uber_token, найдите value и проанализируйте между двумя цитатами после.

Ответ №1:

регулярное выражение — это решение.

используйте import re

 >>> import re
>>> s = '<form id="blah" action="/p-submi.html" method="post"><input type="hidden" id="" name="uber_token" value="123456789"/><div class="container-info"'
>>> regex=re.search(r'name="uber_token" value="([0-9] )"',s)
>>> print regex.group(1)
123456789
 

Ответ №2:

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

Если вы не хотите изучать регулярные выражения (а вы должны быть готовы изучать регулярные выражения!), Вы можете продолжить value=" . Вероятно, действительно неэффективно, но проще отлаживать.

 values = []

with open('myfile.txt') as infile:
    for line in infile:
        candidates = line.split('value="')
        for s in candidates[1:]: #the first token is not a value
            try: #test if value is a number
                val = int(s.split('"')[0]) 
            except:
                continue
            values.append(val)
 

Если вы специально просматриваете HTML или XML, в Python есть библиотеки для обоих.

Затем, например, вы можете написать код для поиска по дереву узла с атрибутом «name», который имеет значение «uber_token», и получить из него атрибут «value».

Очень тупой пример Python 2, который не требует слишком много знаний о ElementTree s (могут потребоваться простые исправления):

 import xml.etree.ElementTree as ET
tree = ET.parse('myfile.xml')
root = tree.getroot()

values = []

for element in root:
    if element.attrib['name'] == 'uber_token':
        values.append(element.attrib['value'])
 

Ответ №3:

Python поставляется с собственным модулем синтаксического анализа xml: https://docs.python.org/3.2/library/xml.html ?выделите =xml#xml, чтобы вам не приходилось использовать стороннюю библиотеку синтаксического анализа. Если вы не хотите или не можете использовать это ….. вы всегда можете перейти к регулярному выражению, но я бы не стал этого делать, когда дело доходит до синтаксического анализа XML