2016-05-24 63 views
2

所以,我有一個html文件,看起來像這樣得到最後一個項目:的Python(湯):獲取嵌套的數據,並在標籤

<title>Speaker Name: Title of Talk | Subtitle | website.com</title> 

... [Other Stuff] 

<div class='meta'><span class='meta__item'> 
Posted 
<span class='meta__val'> 
Jun 2006 
</span></span><span class='meta__row'> 
Rated 
<span class='meta__val'> 
Funny, Informative 
</span></span></div> 

<div class='talk-article__body talk-transcript__body'> TEXT 

<data class='talk-transcript__para__time'>15:57</data> 

我有2200個文件這個樣子,和我希望把將它們全部轉換爲具有AUTHOR,TITLE,DATE,LENGTH和TEXT列的CSV文件。現在,我有什麼是不是最漂亮的代碼,但它的工作原理:

from bs4 import BeautifulSoup as soup 

soup = soup(open(file).read(), "lxml") 
at = soup.find("title").text 
author = at[0:at.find(':')] 
title = at[at.find(":")+1 : at.find("|") ] 
text = soup.find("div", attrs={ "class" : "talk-article__body"}) # still needs cleaning 
date = 
length = 

我不能爲我的生活弄清楚如何在日期得到:我懷疑它是soupre組合,但我承認,我無法將自己的頭圍繞在組合上。

長度的訣竅是,我想找到的是上次時間<data class='talk-transcript__para__time'>發生在文件中並抓住THAT值。

回答

2

你可以試試這個

date_spans = soup.find_all('span', {'class' : 'meta__val'}) 
date = [x.get_text().strip("\n\r") for x in date_spans if re.search(r"(?s)[A-Z][a-z]{2}\s+\d{4}", x.get_text().strip("\n\r"))][0] 
print(date) 
#date = re.findall(r"(?s)<span class=.*?>\s*([A-Z][a-z]{2}\s+\d{4})", str(soup)) 

length_data = soup.find_all('data', {'class' : 'talk-transcript__para__time'}) 
length = [x.get_text().strip("\n\r") for x in length_data if re.search(r"(?s)\d{2}:\d{2}", x.get_text().strip("\n\r"))][-1] 
print(length) 
#length = re.findall(r"(?s).*<data class=.*?>(.*)</data>", str(soup)) 

輸出

Jun 2006 
15:57 
+0

這是優秀!謝謝! –

+0

@JohnLaudun歡迎你 – rock321987

2

你不需要的日期正則表達式,如果第一meta__val是日期,你肯定不需要它因爲您只能使用類名稱talk-transcript__para__time

from bs4 import BeautifulSoup 

h = """<title>Speaker Name: Title of Talk | Subtitle | website.com</title> 
<div class='meta'><span class='meta__item'> 
Posted 
<span class='meta__val'> 
Jun 2006 
</span></span><span class='meta__row'> 
Rated 
<span class='meta__val'> 
Funny, Informative 
</span></span></div> 

<div class='talk-article__body talk-transcript__body'> TEXT 

<data class='talk-transcript__para__time'>15:57</data>""" 

soup = BeautifulSoup(h,"html.parser") 
date = soup.select_one("span.meta__val").text 
time = soup.select_one("data.talk-transcript__para__time").text 
print(date, time) 

輸出:

(u'\nJun 2006\n', u'15:57') 

如果您使用正則表達式,你會通過它找到或find_all:

r = re.compile(r"(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\s+\d{4}") 
soup = BeautifulSoup(h, "html.parser") 
date = soup.find("span", {"class": "meta__val"}, text=r).text.strip() 

這將使你:

'Jun 2006' 
+0

以及輸入是這樣的,你找到了第一個日期..看到有兩個''在輸入..也OP提到,我想找到的是最後時間 _ – rock321987

+0

沒有什麼區別,html是按順序解析的,所以第一個總是先找到 –

+0

這就是我所說的......看到他們都包含不同的文本有日期)..如果span文本中的文本被顛倒,會發生什麼情況 – rock321987