Подберите HTML-теги в Python - PullRequest
1 голос
/ 09 июля 2011

Я пишу фрагмент кода Python, чтобы исправить корпус заголовков в HTML-коде.До сих пор я придумал этот код:

pattern = re.compile("<h1>(.*)</h1>|<h2>(.*)</h2>|<h3>(.*)</h3>|<h4>(.*)</h4>|<h5>(.*)</h5>|<h6>(.*)</h6>")

def replace(m):
    contents = m.group(1)
    replacement = contents[0] + contents[1:].lower()
    return replacement

Затем, учитывая line, я использую преобразование line = pattern.sub(replace, line).

Это не работаетпотому что m.group(1) всегда None, тогда как я бы хотел, чтобы это совпадение соответствовало любому из предложений в моем регулярном выражении.Поскольку шаблоны не могут использовать имя в Python, я несколько растерялся.

Очевидное решение - сгруппировать все шаблоны, которые я использовал, но тогда <h1>bla</h2> будет распознан.Это нехорошо, поскольку <h1><a href="...">Bla</a></h1> <h2>Bla</h2> должно дать два совпадения (<a href="...">Bla</a> и <a href="...">Bla</a>)

Идеи?

Ответы [ 4 ]

5 голосов
/ 09 июля 2011

Из того, что я понимаю, вы просто хотите использовать все заголовки. Вы можете использовать lxml, что сделает это довольно безболезненно:

import lxml.html

doc = lxml.html.parse(your_html)
for i in range(1,7):
    for h in doc.xpath('//h%d' % i):
        h.text = h.text.capitalize()

print lxml.html.tostring(doc)
1 голос
/ 09 июля 2011

Возможно, вы захотите посмотреть на этот вопрос и все тонны комментариев и ответов на него. : -)

Используйте

для разбора html.

1 голос
/ 09 июля 2011

Почему тебя это волнует? HTML-теги не чувствительны к регистру. Если вам нужно правильное решение, используйте такой инструмент, как BeautifulSoup. Синтаксический анализ HTML с использованием регулярных выражений бессмыслен и никогда не рекомендуется (обсуждается достаточно часто).

0 голосов
/ 09 июля 2011

Следующее выражение XPath выделяет все нужные текстовые узлы :

//*[starts-with(name(),'h') 
  and 
   substring(name(),2) >= 1 
  and not(substring(name(),2) >6)
   ]
    //text()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...