使用 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/
我正在尝试解析网页 (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/