2016-05-24 40 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