Найти все теги с определенным значением атрибута - PullRequest
2 голосов
/ 23 сентября 2010

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

<html>
    <body>
        <invalid html here/>
        <dont care> ... </dont care>
        <invalid html here too/>
        <interesting attrib1="naah, it is not this"> ... </interesting tag>
        <interesting attrib1="yes, this is what we want">
            <group>
                <line>
                    data
                </line>
            </group>
            <group>
                <line>
                    data1
                <line>
            </group>
            <group>
                <line>
                    data2
                <line>
            </group>
        </interesting>
    </body>
</html>

Я пробовал BeautifulSoup, но он не может разобрать файл. Парсер lxml, похоже, работает:

broken_html = get_sanitized_data(SITE)

parser = etree.HTMLParser()
tree = etree.parse(StringIO(broken_html), parser)

result = etree.tostring(tree.getroot(), pretty_print=True, method="html")

print(result)

Я не знаком с его API и не могу понять, как использовать getiterator или xpath.

1 Ответ

3 голосов
/ 23 сентября 2010

Вот один из способов, используя lxml и XPath 'descendant::*[@attrib1="yes, this is what we want"]'. XPath указывает lxml посмотреть на всех потомков текущего узла и вернуть тех, у кого атрибут attrib1 равен "yes, this is what we want".

import lxml.html as lh 
import cStringIO

content='''
<html>
    <body>
        <invalid html here/>
        <dont care> ... </dont care>
        <invalid html here too/>
        <interesting attrib1="naah, it is not this"> ... </interesting tag>
        <interesting attrib1="yes, this is what we want">
            <group>
                <line>
                    data
                </line>
            </group>
            <group>
                <line>
                    data1
                <line>
            </group>
            <group>
                <line>
                    data2
                <line>
            </group>
        </interesting>
    </body>
</html>
'''
doc=lh.parse(cStringIO.StringIO(content))
tags=doc.xpath('descendant::*[@attrib1="yes, this is what we want"]')
print(tags)
# [<Element interesting at b767e14c>]
for tag in tags:
    print(lh.tostring(tag))
# <interesting attrib1="yes, this is what we want"><group><line>
#                     data
#                 </line></group><group><line>
#                     data1
#                 <line></line></line></group><group><line>
#                     data2
#                 <line></line></line></group></interesting>
...