Python和BeautifulSoup,通过查找dt文本查找并打印dd列表项

时间:2017-03-20 00:49:20

标签: python html beautifulsoup

这是我试图从中提取的html:

<dl class=“journal-meta—list”>
<dt>Managing editors(s)</dt>
<dd>
    ::before
    “John Doe”
    ::after
</dd>
<dd>
    ::before
    “Jane Doe”
    ::after
<dd>
<dt>Date</dt>
<dd>
    ::before
    “Jan 2017”
    ::after
</dd>
<dd>
    ::before
    “Feb 2017”
    ::after
<dd>

我试图通过搜索标签的内容来查找和打印标签中的文本。所以我想搜索<dt>Managing editors(s)</dt>并返回array where array[0] = "John Doe"array[1] = "Jane Doe"。我不希望所有的dd只是在dt之后的两个。

我可以这样做:

 editorsList = soup.find("dl", class_="journal-meta--list").getText()

我收到包括dt在内的所有文字,但我试图通过dt解析它,然后获取dd的文本直到下一个dt。

我已经加载了BeautifulSoup并且正在工作我只是不知道如何搜索这些列表,谢谢!

2 个答案:

答案 0 :(得分:1)

您可以使用dt过滤器找到string,然后找到所有dd兄弟姐妹。

In [4]: soup.find('dt', string='Managing editors(s)').find_next_siblings('dd')
Out[4]: 
[<dd>
     ::before
     “John Doe”
     ::after
 </dd>, <dd>
     ::before
     “Jane Doe”
     ::after
 <dd>
 </dd></dd>, <dd>
     ::before
     “Jan 2017”
     ::after
 </dd>, <dd>
     ::before
     “Feb 2017”
     ::after
 <dd></dd></dd>]

答案 1 :(得分:0)

您可以使用以下代码来实现预期结果:

# -*- coding: utf-8 -*-
from bs4 import BeautifulSoup
import re
html_string = """<dl class=“journal-meta—list”>
<dt>Managing editors(s)</dt>
<dd>
    ::before
    “John Doe”
    ::after
</dd>
<dd>
    ::before
    “Jane Doe”
    ::after
<dd>
<dt>Date</dt>
<dd>
    ::before
    “Jan 2017”
    ::after
</dd>
<dd>
    ::before
    “Feb 2017”
    ::after
<dd>"""
soup = BeautifulSoup(html_string, "lxml")


def string_search(text) : 
    pattern = r'{}'.format(text)
    return [''.join([i if ord(i) < 128 else ' ' for i in text.get_text().replace("::before", "").replace("::after", "")]).strip()  for text in soup.find('dt', string=pattern).find_next_siblings('dd')][0:2]

print(string_search('Managing editors(s)'))
print(string_search('Date'))

结果将是:

[u'John Doe', u'Jane Doe']
[u'Jan 2017', u'Feb 2017']