这是我试图从中提取的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
并且正在工作我只是不知道如何搜索这些列表,谢谢!
答案 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']