使用elementree灵活处理HTML条数据

Using elementree for flexible processing of HTML data

我正在使用 elementree 从 HTML 中提取数据,其格式随着时间的推移在结构上发生了变化(请参阅下面的示例)。

我目前正在使用 iterfind 查找不同的匹配结构块(font/bb/fontfont

但是,我注意到有一个通用模式。不管使用的是哪一组特定的 HTML 元素,第一个 div child 的最终内部文本是 color,第二个 child是pet-type,第三个child是name.

是否有通过 elementree 执行此操作的通用方法?这将使我的代码更简单,并且可能更 future-proof.

<div>
  <font><b>Brown</b></font><a>Cat</a><font><b>Larry</b></font>
</div>
<div>
  <b><font>White</font></b><i><a>Poodle</a></i><b><font>Foxy</font></b>
</div>
<div>
  <font><i>Tabby</i></font><a><i>Cat</i></a><font>Tempi</font>
</div>

此代码似乎有效:

        items = div.itertext()
        textblocks = []
        for item in items:
            trimmed = item.strip()
            if len(trimmed) > 0:
                textblocks.append(trimmed)
        color = textblocks[0]
        pet_type = textblocks[1]
        name = textblocks[2]
        print(color + ', ' + pet_type + ', ' + name)

我欢迎对代码进行任何改进

这样的事情怎么样:

pets = """<body><div>
  <font><b>Brown</b></font><a>Cat</a><font><b>Larry</b></font>
</div>
<div>
  <b><font>White</font></b><i><a>Poodle</a></i><b><font>Foxy</font></b>
</div>
<div>
  <font><i>Tabby</i></font><a><i>Cat</i></a><font>Tempi</font>
</div></body>"""

animals = []
doc = ET.fromstring(pets)
for pet in doc.findall('.//div'):
    animals.append([animal.text  for animal in pet.findall('.//*') if animal.text]  )

animals

输出:

[['Brown', 'Cat', 'Larry'],
 ['White', 'Poodle', 'Foxy'],
 ['Tabby', 'Cat', 'Tempi']]