【发布时间】:2015-07-21 08:21:58
【问题描述】:
我必须从论坛下载所有帖子:http://forum.ubuntu.cz/ 我用 Python 2.7 编写代码
我遍历for 循环一个表中的所有帖子(表代表<form name = "quickModForm" >),每个帖子都在<div class = "windowbg"> 或class = "windowbg2" 中。每个帖子都包括<div class = "poster"> 和<div class = "postarea">。从“poster”中提取作者姓名,从“postarea”中提取发布时间和帖子内容。
当我在此页面http://forum.ubuntu.cz/index.php?topic=5279.0 上运行我的代码时,我成功阅读了第一篇文章,但没有阅读第二篇文章。
这是我的代码的一部分:
posts = urllib2.urlopen(link)
posts_soup = BeautifulSoup(posts.read())
form = prispevky_soup.find("form", {"name": "quickModForm"})
for divs in form.find_all("div", { "class": [ "windowbg", "windowbg2"]}):
div = divs.find("div", {"class": "post_wrapper"})
div_body = div.find("div", {"class": "postarea"})
div_header = div.find("div", {"class": "poster"})
我发现在 div_header 中总是我需要的所有信息,并且在 div_body 中的某些帖子中是 None,我不知道为什么第一次迭代成功而第二次迭代只是部分,因为
div_header = divs.find("div", {"class": "poster"}) 功能正常,div_body = divs.find("div", {"class": "postarea"}) 有时不能。帖子的源代码非常相似。
感谢您的帮助,对不起我的英语。
【问题讨论】:
-
澄清一下:为什么
divs[1].find("div", {"class": "postarea"})是空的? -
是的,
divs.find("div", {"class": "postarea"})在某些情况下为空,而divs.find("div", {"class": "poster"})总是成功,为什么 -
看起来这是损坏的 HTML。我尝试了几个不同的在线验证器,除此之外,他们都抱怨
</div>没有匹配的<div>。 -
同时,stdlib
html.parser和lxml最终都以post_wrapperdiv 下方没有postarea或以下任何内容结束;在poster之后的下一个div是error中向下的一条路。而使用html5lib解析器也无济于事,因为这不是HTML5……尝试将其解析为XML 会更快地失败; lxml 甚至找不到windowbg2这样。 -
我正在查看 validator.w3.org,您认为这是问题所在,它破坏了我的代码吗?
标签: python html beautifulsoup posts download