使用 python 解析网页

parsing webpage using python

我正在尝试解析网页 (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 标记中的线程 link?感谢您的帮助。

这里的想法是使用 CSS selectors 并在 h3 中获取 a 元素,在 div 中获取 class="title",在 class="titleText" 在具有 id 属性的 li 元素内,以 "thread":

开头
for link in soup.select("div.discussionList li[id^=thread] div.titleText h3.title a[href]"):
    print link["href"]

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

因此,根据此处的代码,您有 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  "})

理想情况下,您会找出唯一的 class 您可以检查并使用它,而不是 classes.

的列表

如果您希望此对象内部有一个 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/