首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python (汤):获取嵌套数据并获取标记中的最后一项

Python (汤):获取嵌套数据并获取标记中的最后一项
EN

Stack Overflow用户
提问于 2016-05-24 03:51:20
回答 2查看 70关注 0票数 2

所以我有一个html文档,它看起来像这样:

代码语言:javascript
复制
<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个这样的文件,我希望把它们都放到CSV文件中,列有作者、标题、日期、长度和文本。现在,我所拥有的并不是最漂亮的代码,但它有效:

代码语言:javascript
复制
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'>并获取该值。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-05-24 05:45:02

你可以试试这个

代码语言:javascript
复制
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))

输出

代码语言:javascript
复制
Jun 2006
15:57
票数 2
EN

Stack Overflow用户

发布于 2016-05-24 19:16:16

如果第一个meta__val是日期,则不需要日期的正则表达式,因为您只需使用类名talk-transcript__para__time就可以了。

代码语言:javascript
复制
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)

输出:

代码语言:javascript
复制
 (u'\nJun 2006\n', u'15:57')

如果您正在使用regex,则会传递它以查找或find_all:

代码语言:javascript
复制
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() 

这会让你:

代码语言:javascript
复制
'Jun 2006'
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37404071

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档