使用Python和BeautifulSoup 3从事件页面获取基本的抗议信息

时间:2017-09-19 07:48:20

标签: python beautifulsoup

我正试图在一个网站上提供一些信息,其中列出了BS3的抗议活动列表,但是我还在努力记住如何正确地解决所有问题。最后,我希望每个事件都进入一个csv,其中包含以下信息:

datetime as' 2011-01-10',抗议链接' 012371',抗议名称'牛牧场主的演示',位置ID ' 1728',地点名称'市政厅',最重要的是,国名'马达加斯加'。

页面代码如下:

<li><article class="protest"><div class="rdf5"><div itemscope itemtype="Protest"><span style="display:none;"><time itemprop="startDate" datetime="2011-01-10T00:00">2011-01-10T00:00</time></span><p class="flag"><img src=/images/flags/flagger.gif></p> <span> 2011 /</span><br /><a href="/protests/012371" itemprop="url summary">Cattle Rancher's Demo</a> at ​<span itemprop="location" itemscope itemtype="organization"><span itemprop="name"><a href=/location.aspx?id=1728>City Hall</a></span> / <span itemprop="address" itemscope itemtype="address"><a href=/protests.aspx?ai=10><span itemprop="country-name">Madagscar</span></a></span></div></article></li>

我可以成功地将各个元素拉出来,例如:

for event in soup.findAll("span", itemprop="country-name"):
    print event.contents[0]

但我真正想要的是用class id抗议调用每个整体文章块,然后获取我想要的所有内容,准备在csv中写出一行。所以我试着这样做......

for article in soup.findAll('article', class_="protest"):
    country = soup.find("span", itemprop="country-name")
    print country
    datetime = 
    etc

......但那失败了。 如果我只是在文章&#39; ...

上使用findAll,我可以得到它
for article in soup.findAll('article'):

...然后,它返回同一个国家数百次,因为我认为它只是得到第一个然后拉国家x次(其中x是页面中有多少篇文章元素)。

如果有人可以帮助我达到目的,例如,只是每个文章块的国家和日期时间,那么我确定我可以完成其余的工作!

1 个答案:

答案 0 :(得分:0)

使用我发现的美丽汤的方法是在处理标记时继续添加片段 - 我选择一个子元素并在我的循环中打印它,并继续选择位直到我得到我想要的,然后将其保存到变量并继续下一个我想要的位。我不确定你的第二个循环&#34;失败&#34; - 它似乎找到了国家名称的跨度就好了,如果你用这种方式保存,我相信你会到达那里。

{{1}}

我刚刚注意到你正在使用bs3和python 2.6,上面是针对bs4和3.6的,但是你应该明白并能够翻译这个过程。实际上,akash确切地指出了为什么你的循环不起作用,你需要改变你的循环来做{{1}}