使用python解析网页

时间:2015-06-22 21:27:07

标签: python web web-scraping beautifulsoup html-parsing

我正在尝试解析一个网页(forums.macrumors.com)并获取所有帖子的列表。

所以到目前为止我已经得到了这个:

import urllib2 
import re

from BeautifulSoup import BeautifulSoup
address = "http://forums.macrumors.com/forums/os/"                         
website = urllib2.urlopen(address) 
website_html = website.read() 
text = urllib2.urlopen(address).read()
soup = BeautifulSoup(text)

现在网页源代码在每个帖子的开头都有这个代码:

<li id="thread-1880" class="discussionListItem visible sticky WikiPost  "   
data-author="ABCD">

我如何解析这个,以便我可以进入这个li标签内的线程链接?谢谢你的帮助。

2 个答案:

答案 0 :(得分:0)

这里的想法是使用CSS selectors并使用a h3内的class="title"获取div元素class="titleText" liid元素内部,for link in soup.select("div.discussionList li[id^=thread] div.titleText h3.title a[href]"): print link["href"] 属性以&#34开头;线程&#34;:

!=

你可以进一步调整选择器,但这应该给你一个很好的起点。

答案 1 :(得分:0)

因此,从您的代码中,您有soup对象,其中包含您的html的BeautifulSoup对象。问题是你要寻找的那个标签的哪一部分是静态的? id总是一样的吗? class

id

查找
my_li = soup.find('li', {'id': 'thread-1880'})

class

查找
my_li = soup.find('li', {'class': 'discussionListItem visible sticky WikiPost  "})

理想情况下,您可以找出可以检查的唯一类,并使用它而不是类列表。

如果您希望此对象中包含a标记,则可以执行以下操作来检查:

if my_li and my_li.a:
    print my_li.a.attrs.get('href')

我总是建议您进行检查,因为如果my_li最终为None或其中没有a,则您的代码将失败。

有关更多详细信息,请查看BeautifulSoup文档 http://www.crummy.com/software/BeautifulSoup/bs4/doc/