Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 将没有类名的多个html标记解析为不同的变量_Python_Html_Parsing_Web Scraping_Beautifulsoup - Fatal编程技术网

Python 将没有类名的多个html标记解析为不同的变量

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

所以在这个HTML中,我想用它们各自的值创建python变量,我已经获得了20K+的结果,可以解析大部分数据,但我不知道如何将其分解,因为没有类名,它们都在同一个div下

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