Python и регулярные выражения веб-тегов - PullRequest
1 голос
/ 10 августа 2009

мне нужен webpage-контент. Мне нужно получить некоторые данные из него. Похоже:

ДАННЫЕ

Как я понимаю, мне нужно использовать регулярные выражения, но я не могу выбрать один.

Я попробовал код ниже, но не дал никаких результатов. Пожалуйста, поправьте меня:

regexHandler = re.compile('(<div class="deg">(?P<div class="deg">.*?)</div>)')
result = regexHandler.search( pageData )

Ответы [ 4 ]

6 голосов
/ 10 августа 2009

Я предлагаю использовать хороший анализатор HTML (например, BeautifulSoup ), но для ваших целей, например, с правильно сформированным HTML в качестве входных данных, которые поставляются со стандартной библиотекой Python, например HTMLParser , также должен хорошо работать), а не необработанные RE для анализа HTML.

Если вы хотите сохранить постоянный подход RE, шаблон:

r'<div class="deg">([^<]*)</div>'

выглядит как самый простой способ вывести строку 'DATA' из строки '<div class="deg">DATA</div>' - при условии, что это то, что вам нужно. Возможно, вам придется добавить один или несколько \s* в те места, где вам нужно допускать дополнительные пробелы.

3 голосов
/ 10 августа 2009

Если вы хотите, чтобы теги div были включены в соответствующий элемент:

regexpHandler = re.compile('(<div class="deg">.*?</div>)')

Если вы не хотите, чтобы теги div были включены, только часть DATA:

regexpHandler = re.compile('<div class="deg">(.*?)</div>')

Затем запустить матч и получить результат:

result = regexHandler.search( pageData )
matchedText = result.groups()[0]
0 голосов
/ 10 августа 2009

Хотя использование rexex для быстрой и грязной обработки html вполне нормально, гораздо лучше и чище использовать html-анализатор, такой как lxml.html , и запрашивать проанализированное дерево с помощью XPath или CSS селекторы .

html = """<html><body><div class="deg">DATA1</div><div class="deg">DATA2</div></body></html>"""

import lxml.html

page = lxml.html.fromstring(html)
#page = lxml.html.parse(url)

for element in page.findall('.//div[@class="deg"]'):
    print element.text

#using css selectors
from lxml.cssselect import CSSSelector
sel = CSSSelector("div.deg")

for element in sel(page):
    print element.text
0 голосов
/ 10 августа 2009

вы можете использовать простые строковые функции в Python, нет необходимости в регулярных выражениях

mystr = """< div class="deg">DATA< /div>"""
if "div" in mystr and "class" in mystr and "deg" in mystr:
    s = mystr.split(">")
    for n,item in enumerate(s):
        if "deg" in item:
            print s[n+1][:s[n+1].index("<")]

мой подход, найди что-нибудь, на что можно разделить. например, в приведенном выше, я разделил на «>». Затем просмотрите разделенные элементы, проверьте «градус» и получите элемент после него, поскольку «град» появляется перед данными, которые вы хотите получить. Конечно, это не единственный подход.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...