Это проблема с выражениями, возвращаемыми makeHTMLTags
, из-за которой происходит много дополнительных группировок и имен, которые мешают вам, если вы просто хотите текст тега.
В Pyparsing входит методoriginalTextFor
, чтобы помочь решить эту проблему.Основываясь на примере кода из @samplebias:
start, end = makeHTMLTags('div')
#anchor = start + SkipTo(end).setResultsName('body') + end
anchor = originalTextFor(start + SkipTo(end).setResultsName('body') + end)
Оборачивая выражение в originalTextFor
, все разбиение тега на его составные части отменяется, и вы просто возвращаете текст изисходная строка (также включая любые промежуточные пробелы).Поведение по умолчанию - просто вернуть вам эту строку, что имеет неприятный побочный эффект потери всех имен результатов, поэтому возвращение проанализированных значений атрибута может быть хлопотным.Когда я писал originalTextFor
, я предполагал, что нужна именно строка, и я не мог прикрепить имена результатов к строке.Поэтому я добавил необязательный параметр asString
в originalTextFor
, который по умолчанию равен True, но если он передан как False, он вернет ParseResults, содержащий только один токен всей совпадающей строки, плюс все совпадающие имена результатов,Таким образом, вы все еще можете извлечь res.id
из результатов, в то время как res[0]
вернет вам весь соответствующий HTML.
Некоторые другие комментарии:
<div>
- очень распространенный тег, иодин легко сопоставляется по ошибке, используя только тег, возвращаемый makeHTMLTags
.Он будет соответствовать любому div, и, вероятно, многим, которые вам не очень интересны. Вы можете сократить количество несоответствий, если можете указать какой-либо атрибут, который также должен совпадать, используя withAttribute
.Вы можете сделать это с помощью:
start.setParseAction(withAttribute(id="purchaseShvl"))
или
start.setParseAction(withAttribute(**{"class":"shovelr"}))
(Использование 'class' в качестве атрибута фильтрации, вероятно, является наиболее распространенной вещью, которую вы хотите сделать, но так как 'class 'также является ключевым словом Python, вы можете просто использовать форму именованных аргументов, как я сделал с id, тоже неплохо.)
Наконец, наряду с общностью <div>
является вероятность вложения.элементы div часто вложены в элементы div, и просто SkipTo недостаточно умен, чтобы принять это во внимание.Мы видим это при восстановлении ваших опубликованных результатов:
<div class='shovelr' id='purchaseShvl>
<div class='shovelr-heading'>
<p>Customers WhoBought This Item Also Bought</p>
</div>
Первый завершающий </div>
заканчивает совпадение для вашего выражения.Я подозреваю, что вам, возможно, придется расширить свое совпадающее выражение, чтобы учесть эти дополнительные элементы div вместо простого SkipTo (end).