Pyparsing, BeautifulSoup ve regex arasında iyi bir geçici adımdır. HTML etiket ayrıştırması, durum, boşluk, öznitelik varlığı/yokluğu/düzeni gibi varyasyonları anladığından, bu tür temel etiket çıkartma işlemlerini BS kullanarak yapmaktan daha kolay olduğu için, normal ifadelerden daha sağlamdır.
Örneğiniz, aradığınız her şey açılış "giriş" etiketinin özelliklerinde olduğundan, özellikle basittir. İşte regexes uyuyor verecekti girişinizi etiketi üzerinde çeşitli varyasyonlar gösteren bir pyparsing örnek olduğunu ve aynı zamanda bir yorum içindeki ise bir etiket maç için değil gösterir:
html = """<html><body>
<input type="hidden" name="fooId" value="**[id is here]**" />
<blah>
<input name="fooId" type="hidden" value="**[id is here too]**" />
<input NAME="fooId" type="hidden" value="**[id is HERE too]**" />
<INPUT NAME="fooId" type="hidden" value="**[and id is even here TOO]**" />
<!--
<input type="hidden" name="fooId" value="**[don't report this id]**" />
-->
<foo>
</body></html>"""
from pyparsing import makeHTMLTags, withAttribute, htmlComment
# use makeHTMLTags to create tag expression - makeHTMLTags returns expressions for
# opening and closing tags, we're only interested in the opening tag
inputTag = makeHTMLTags("input")[0]
# only want input tags with special attributes
inputTag.setParseAction(withAttribute(type="hidden", name="fooId"))
# don't report tags that are commented out
inputTag.ignore(htmlComment)
# use searchString to skip through the input
foundTags = inputTag.searchString(html)
# dump out first result to show all returned tags and attributes
print foundTags[0].dump()
print
# print out the value attribute for all matched tags
for inpTag in foundTags:
print inpTag.value
Baskılar:
['input', ['type', 'hidden'], ['name', 'fooId'], ['value', '**[id is here]**'], True]
- empty: True
- name: fooId
- startInput: ['input', ['type', 'hidden'], ['name', 'fooId'], ['value', '**[id is here]**'], True]
- empty: True
- name: fooId
- type: hidden
- value: **[id is here]**
- type: hidden
- value: **[id is here]**
**[id is here]**
**[id is here too]**
**[id is HERE too]**
**[and id is even here TOO]**
Püskürtme işleminin yalnızca bu öngörülemeyen varyasyonlarla eşleştiğini değil, veriyi tek tek etiket özelliklerinin ve değerlerinin okunmasını kolaylaştıran bir nesnede döndürdüğünü görebilirsiniz.
"Yeni" anahtar kelimenin bir uyumsuzluk olduğunu düşünüyorum. –