2017-03-20 39 views
0

這裏打印的DD列表中的項目是我試圖從提取HTML:Python和BeautifulSoup,發現和尋找DT文本

<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加載和工作我只是不知道如何搜索這些列表,謝謝!

回答

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>] 
+0

感謝您的回答。我不想在搜索dt之後找到所有的dd。所以我想搜索管理編輯dt,只能找回John Doe和Jane Doe的文本。然後我想搜索DT「日期」,並獲得兩個日期的文本返回..謝謝 – miltonjbradley

+0

@'fild_next_siblings'將返回一個列表,你可以切片它得到前兩個DD –

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