使用BeautifulSoup提取特定的dl和dd列表元素

时间:2015-09-09 09:20:46

标签: python html beautifulsoup extract

我的第一次发帖。我正在使用BeautifulSoup 4和python 2.7(pycharm)。我有一个包含元素的网页,我需要提取标签为“Salary:”或“Date:”的特定元素,该页面包含多个列表。

问题:我似乎无法识别和提取特定文本。我搜索了这个网站并尝试没有成功。

示例html:

<dl><dt>Date:</dt><dd>13 September 2015</dd><dt>Salary:</dt><dd>Starting at £40,130 per annum.</dd></dl><dl><dt>Date:</dt><dd>15 December 2015</dd><dt>Salary:</dt><dd>Starting at £22,460 per annum.</dd></dl><dl><dt>Date:</dt><dd>10 January 2014</dd><dt>Salary:</dt><dd>Starting at £18,160 per annum.</dd></dl>

我尝试过但没有成功的代码:

r = requests.get("http://www.mywebsite.com/test.html")
soup = BeautifulSoup(r.content, "html.parser")
dl_data = soup.find_all("dl")
for dlitem in dl_data: 
    print dlitem.find("dt",text="Date:").parent.findNext("dd").contents[0]
    print dlitem.find("dt",text="Salary:").parent.findNext("dd").contents[0]

预期结果:

13 September 2015
15 December 2015
10 January 2014
Starting at £40,130 per annum.
Starting at £22,460 per annum.
Starting at £18,160 per annum.

实际结果:

print dlitem.find("dt",text="Date:").parent.findNext("dd").contents[0]
AttributeError: 'NoneType' object has no attribute 'parent'

我已经尝试过这个代码的多种变体并绕圈子了,我想出了如何将所有dd元素打印到屏幕上,而不是特定的dd元素!

谢谢

2 个答案:

答案 0 :(得分:1)

我想如果您只是在代码中省略.parent,它就会起作用。至少这可以解决我的问题,这与您的问题非常相似。

这是我的html,其中<dt>的顺序不能保证:

<dl>
 <dt>Time</dt><dd>10:05:02</dd>
 <dt>Temp</dt><dd>20.5°C</dd>
</dl>

我正在使用以下代码成功访问值:

 time = at_tl.find("dt",text="Time").findNext("dd").string
 temp = at_tl.find("dt",text="Temp").findNext("dd").string

答案 1 :(得分:0)

更强大的解决方案是在 dl 中创建所有 (dt,dd) 元素的 dict (key,value) 对。然后从字典中选择所需的字段。


如何将“dl”元素转换为字典

某个类“obj”中的数据:

html = """
    <dl class="obj">
      <dt>Time</dt> <dd>10:00</dd>
      <dt>Temp</dt> <dd>20.5°C</dd>
    </dl>  
       """

保存所有的“dt”a和“dl”,然后将它们压缩成一个字典:

def get_dl(soup):
    keys, values = [], []
    for dl in soup.findAll("dl", {"class": "obj"}):
        for dt in dl.findAll("dt"):
            keys.append(dt.text.strip())
        for dd in dl.findAll("dd"):
            values.append(dd.text.strip())
    return dict(zip(keys, values))

soup = BeautifulSoup(html, features="html.parser")
dl_dict = get_dl(soup)

输出:

{'Time': '10:00', 'Temp': '20.5°C'}