我有一个xml-ish文件,我试图用BeautifulSoup解析,让我们说另一个标签的树中有一个未知的标签。事情顺便进行,至少对于我在一组nexted标签中提取的第一个标签。这不是真正的html或xml,而是关闭......
给定格式:
<data>
<type>
<type_attribute_1>1</type_attribute_1>
<type_attribute_2>2</type_attribute_2>
</type>
<type>
<type_attribute_1>3</type_attribute_1>
<type_attribute_2>4</type_attribute_2>
</type>
</data>
如何为两个类型标记提取type_attribute_1和type_attribute_2的值并分配给变量 - 即“Type_1_attribute_1”,“Type_1_attribute_2”,“Type_2_attribute_1”&amp; “Type_2_attribute_2”
我正在使用这样的代码,但它仅适用于位于<type>
内的第一个<data>
:
Type_1_Attribute_1 = soup.data.type.type_attribute_1.text
Type_1_Attribute_2 = soup.data.type.type_attribute_2.text
更新
我认为用一些不同的方式来表达我所寻求的东西可能有所帮助。我不知道变量名称Type_1_Attribute_1,因为我不知道有多少类型的兄弟姐妹,将“_1”,“_ 2”,“_ 3”...添加到“类型”,对于每个兄弟。即, 假设:
Types = [i.stripText() for i in soup.select('Type')]
parseables = len(Types)
for i in range(0, parseables)
j = i+1
Type = Types[i]
Attribute_1 = Type.Type_Attribute_1.text
print Attribute_1
为每个Type打印Attribute_1的值,如何在Attribute_1中添加“Type_j”以用j的值填充?
答案 0 :(得分:2)
这个怎么样 -
from bs4 import BeautifulSoup as bs
data = """<data>
<type>
<type_attribute_1>1</type_attribute_1>
<type_attribute_2>2<2/type_attribute_2>
</type>
<type>
<type_attribute_1>3</type_attribute_1>
<type_attribute_2>4</type_attribute_2>
</type>
</data>"""
soup = bs(data,'lxml')
Type_1_Attribute_1 = [i.text.strip() for i in soup.select('type_attribute_1')]
Type_1_Attribute_2 = [i.text.strip() for i in soup.select('type_attribute_2')]
print filter(bool,Type_1_Attribute_1)
print filter(bool,Type_1_Attribute_2)
输出 -
[u'1', u'3']
[u'2', u'4']
EDIT 我没有得到你,为什么你需要这个循环在列表本身的变量(迭代器) - 例如
for i in Type_1_Attribute_1:
print (i)# here i itself a variable and it changes when i reiterate
打印 -
1
3
因此,如果您需要使用该列表中的每个项目,只需使用迭代器并在传递给print
函数时传递给函数。