Получение строки из HTML на неуникальной таблице - PullRequest
0 голосов
/ 16 мая 2011

Вот HTML, который я пытаюсь разобрать.

<TD>Serial Number</TD><TD>AB12345678</TD>

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

serialNumber = re.search("Serial Number</td><td>\n(.*?)</td>", source)

Источник - это просто исходный код страницы, захваченной с помощью urllib. В html есть новая строка между вторым и серийным номером, но я не уверен, имеет ли это значение.

Ответы [ 2 ]

2 голосов
/ 17 мая 2011

Pyparsing может дать вам немного более надежный экстрактор для ваших данных:

from pyparsing import makeHTMLTags, Word, alphanums

htmlfrag = """<blah></blah><TD>Serial Number</TD><TD>
            AB12345678
            </TD><stuff></stuff>"""

td,tdEnd = makeHTMLTags("td")

sernoFormat = (td + "Serial Number" + tdEnd + 
                td + Word(alphanums)('serialNumber') + tdEnd)


for sernoData in sernoFormat.searchString(htmlfrag):
    print sernoData.serialNumber

Отпечатки:

AB12345678

Обратите внимание, что pyparsing не волнует, где падает дополнительный пробел,он также обрабатывает неожиданные атрибуты, которые могут возникать в определенных тегах, пробелы внутри тегов, теги в верхнем / нижнем регистре и т. д.

0 голосов
/ 17 мая 2011

В большинстве случаев лучше работать с HTML, используя соответствующий анализатор, но в некоторых случаях вполне нормально использовать регулярные выражения для работы.Я не знаю достаточно о вашей задаче, чтобы судить, является ли это хорошим решением или лучше использовать решение @Paul, но здесь я пытаюсь исправить ваше регулярное выражение:

serialNumber = re.search("Serial Number</td><td>(.*?)</td>", source, re.S | re.I )

Я удалил\n, потому что это трудно, на мой взгляд (\ n, \ r, \ r \ n, ...?), вместо этого я использовал опцию re.S (Dotall).

Но будьтезнайте, теперь, если есть новая строка, она будет в вашей группе захвата!то есть вы должны впоследствии удалить из своего результата пробелы.

Другая проблема вашего регулярного выражения - это <TD> в вашей строке, но вы ищете <td>.Для этого есть опция re.I (IgnoreCase).

Вы можете найти больше объяснений о регулярных выражениях здесь на docs.python.org

...