【发布时间】:2019-09-04 02:41:29
【问题描述】:
我有一些示例 html,我正在尝试从中解析和提取数据。这是数据的样子:
<div class="content">
<h1 class = “heading1”>MOVIE TITLE<h1>
<h2 class="heading2”>Synopsis</h2>
<div>
<p>this text is the synopsis of the movie.</p>
</div>
<h2 class="heading2”>Cast</h2>
<div>
<p>The cast includes</p>
<ol>
<li>Actor</li>
<li>Actor</li>
<li>Actor</li>
<li>Actor</li>
<li>Actor</li>
</ol>
</div>
</div>
<div class="content">
<h1 class = “heading1”>MOVIE TITLE<h1>
<h2 class="heading2”>Synopsis</h2>
<div>
<p>this text is the synopsis of the movie.</p>
</div>
<h2 class="heading2”>Cast</h2>
<div>
<p>The cast includes</p>
<ol>
<li>Actor</li>
<li>Actor</li>
<li>Actor</li>
<li>Actor</li>
<li>Actor</li>
</ol>
</div>
</div>
我想理想地提取四个部分,标题、概要和演员表。至此,解析它并使用美丽的汤提取每个电影实例:
from bs4 import BeautifulSoup
data = open("movies.txt",'r').read()
soup = BeautifulSoup(data, "html.parser")
我已经像这样提取了每部电影:
movies = soup.find_all('div', attrs={'class':'content'})
以及每部电影的片名
movies.find_all('h1', attrs={'class':'heading1'})
相当容易,因为它们具有独特的类属性。
我也想提取概要;只是<p> 标签之间的那一行;和演员名单分开,就像我对标题所做的那样。但是,到目前为止我能够做到
movies.find_all('h2', attrs={'class':'heading2'})
你可以想象,这只是给了我“概要”和“演员表”
【问题讨论】:
-
您提供的 html 是否正确?我的意思是,它似乎重复了两次。此外,请看第二行。
<h1>标签未正确关闭。 -
我将使用 BeautifulSoup 来探索它的 RE 用法。我已经好几年没用过了。任何人这将暂时起作用。
>>> import re,,>>> re.findall('>Synopsis</[\S]+?>[\S\s]*?<p>([\S\s]*?)</p>', string) -
heading2的结束引号与它的 开始 引号不匹配。ord('”') --> 8221; ord('"') --> 34您可能想在做任何其他事情之前批发更换那些。 ...stackoverflow.com/a/37021721/2823755 -
@wwii Whelp,这让我想起了我鄙视 BeautifulSoup 的原因。对我来说,它让一切变得更加复杂,在不同版本中的行为大相径庭,并且使正则表达式的使用变得困难且不一致。我查看并试图从你提到和堵嘴的帖子中得到结果。不知道是不是因为我在 Py2.7 但是,无论如何。 BS4 让我头疼,
标签: python html regex parsing beautifulsoup