使用elementree灵活处理HTML条数据
Using elementree for flexible processing of HTML data
我正在使用 elementree 从 HTML 中提取数据,其格式随着时间的推移在结构上发生了变化(请参阅下面的示例)。
我目前正在使用 iterfind
查找不同的匹配结构块(font/b
、b/font
、font
)
但是,我注意到有一个通用模式。不管使用的是哪一组特定的 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']]
我正在使用 elementree 从 HTML 中提取数据,其格式随着时间的推移在结构上发生了变化(请参阅下面的示例)。
我目前正在使用 iterfind
查找不同的匹配结构块(font/b
、b/font
、font
)
但是,我注意到有一个通用模式。不管使用的是哪一组特定的 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']]