我正试图在一个网站上提供一些信息,其中列出了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是页面中有多少篇文章元素)。
如果有人可以帮助我达到目的,例如,只是每个文章块的国家和日期时间,那么我确定我可以完成其余的工作!
答案 0 :(得分:0)
使用我发现的美丽汤的方法是在处理标记时继续添加片段 - 我选择一个子元素并在我的循环中打印它,并继续选择位直到我得到我想要的,然后将其保存到变量并继续下一个我想要的位。我不确定你的第二个循环&#34;失败&#34; - 它似乎找到了国家名称的跨度就好了,如果你用这种方式保存,我相信你会到达那里。
{{1}}
我刚刚注意到你正在使用bs3和python 2.6,上面是针对bs4和3.6的,但是你应该明白并能够翻译这个过程。实际上,akash确切地指出了为什么你的循环不起作用,你需要改变你的循环来做{{1}}