【问题标题】:Using elementree for flexible processing of HTML data使用 elementree 灵活处理 HTML 数据
【发布时间】:2022-01-15 01:25:48
【问题描述】:

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

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

但是,我注意到有一个通用模式。无论使用的特定 HTML 元素集如何,第一个 div 子元素的最终内部文本是 color,第二个子元素是 pet-type,第三个子元素是child 是名称

是否有通过elementree 执行此操作的通用方法?这将使我的代码更简单,并且可能更具前瞻性。

<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>

【问题讨论】:

    标签: python html elementtree


    【解决方案1】:

    这样的事情怎么样:

    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']]
    

    【讨论】:

    • 啊,'.//*' - 这很聪明。
    • @ianmayo 谢谢!
    【解决方案2】:

    此代码似乎可以工作:

            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)
    
    

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

    【讨论】:

    • 这是一个建议的答案。此后,+jack-fleeting 提供了更好的答案
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-01-21
    • 2015-02-01
    • 2012-10-11
    • 1970-01-01
    • 1970-01-01
    • 2020-03-20
    • 1970-01-01
    相关资源
    最近更新 更多