Python 将没有类名的多个html标记解析为不同的变量
所以在这个HTML中,我想用它们各自的值创建python变量,我已经获得了20K+的结果,可以解析大部分数据,但我不知道如何将其分解,因为没有类名,它们都在同一个div下Python 将没有类名的多个html标记解析为不同的变量,python,html,parsing,web-scraping,beautifulsoup,Python,Html,Parsing,Web Scraping,Beautifulsoup,所以在这个HTML中,我想用它们各自的值创建python变量,我已经获得了20K+的结果,可以解析大部分数据,但我不知道如何将其分解,因为没有类名,它们都在同一个div下 <div class="callout callout-details"> <h4>Details</h4> <dl class="dl-horizontal"> <dt>Deadline:</dt> <dd>Non
<div class="callout callout-details">
<h4>Details</h4>
<dl class="dl-horizontal">
<dt>Deadline:</dt>
<dd>None</dd>
<dt>Award type:</dt>
<dd>Scholarship</dd>
<dt>Award coverage:</dt>
<dd>Other</dd>
<dt>Renewable</dt>
<dd>No</dd>
<dt>Min. award:</dt>
<dd>$2,000</dd>
<dt>Average award:</dt>
<dd>$2,000</dd>
<dt>Max. award:</dt>
<dd>$2,000</dd>
<dt>Awarded anualy:</dt>
<dd>No</dd>
<dt>Unlimited awards:</dt>
<dd>No</dd>
<dt>Repay required:</dt>
<dd>No</dd>
</dl>
</div>
我似乎不知道如何正确地构造上述内容,以访问所有
dd
字段 由于它们成对出现,您可以使用切片将它们压缩在一起:
containers = page_soup.findAll("dl", {"class": "dl-horizontal"})
names = containers.children[::2] # Every even elements (0, 2, 4, ...)
values = containers.children[1::2] # Every off elements (1, 3, 5, ...)
for name, value in zip(names, values):
print(name) # ("Deadline:", "Award type:", ...)
print(value) # ("None", "Scholarship", ...)
切片这样工作,考虑列表<代码> A<代码>,您可以做<代码> A[开始:结束:步骤] < /代码>。它将返回一个新列表,从
开始
值开始,直到结束
之前的值(不包括它)。并且将仅包括每个步骤nd值
a = ['a', 'b', 'c', 'd']
# Leaving start blank is same as 0.
# And leaving end blank is same as the length of a, so include all elements
a[:] => ['a', 'b', 'c', 'd']
a[::2] => ['a', 'c']
a[1::2] => ['b', 'd']
# Zip groups elements of multiple lists aligned
zip(a[::2], a[1::2]) => [('a', 'b'), ('c', 'd')]
只要做一个dict,其中键是dt,值是每个dt的“下一个”ddI我不确定我是否理解问题所在,有很多简单的方法可以解决这个问题。我首先想到的是在两个不同的查询中.findall()
dt
和dd
,然后压缩列表。路易斯·费拉兹的答案与此相似,这也是一个很好的解决方案。另外,要注意如何命名变量。变量名和函数名应遵循带有下划线的小写形式。您希望的输出是什么?@jackfleet只是值,我正在用逗号分隔的表格创建一个巨大的奖学金列表,这将有助于我更好地过滤结果。@AlexanderCécile谢谢我会使用这种风格,问题是我在网页抓取方面是新手,所以我在这一部分遇到了麻烦,非常感谢,我不知道zipI,但我没有注意到@pguardiario提到的内容,这些值已经在不同的标记中了。。。您可以使用查找,获得它们,但我会留下我的答案,因为切片很有趣。谢谢!我没有意识到这一点,只是做了一些研究,没有进步,这帮了我很大的忙!尽管容器
是一个列表,但这会起作用吗?您不需要对列表中的每个元素进行迭代并调用children
吗?@AlexanderCécile它不起作用,但了解了zip并能够在列表中进行迭代,谢谢大家
a = ['a', 'b', 'c', 'd']
# Leaving start blank is same as 0.
# And leaving end blank is same as the length of a, so include all elements
a[:] => ['a', 'b', 'c', 'd']
a[::2] => ['a', 'c']
a[1::2] => ['b', 'd']
# Zip groups elements of multiple lists aligned
zip(a[::2], a[1::2]) => [('a', 'b'), ('c', 'd')]