- 导入需要的模块
- 需要安装BeautifulSoup
from urllib.request import urlopen, HTTPError, URLError
from bs4 import BeautifulSoup
import re
要抓取的内容里面的链接如图
打开网页审查查看标签如图:
可以看出内容属于标签
dd
以及dd
的属性是class="desc"
则:-
如果有异常则打印
HTTPError, URLError
异常内容- 首先查找标签
bsObj.find('dd', {'class':'desc'})
- 再查找
dd
标签下的子标签a
,标签a
的属性href
用正则表达式匹配筛选,因为其下面的链接是以view
或者subview
开头的 - 判断如果
href
属性在标签a
中则打印链接.最后完成打印.
- 首先查找标签
try:
html = urlopen('http://baike.baidu.com/link?url=FfHqPzChV9Iz7Kz0d2Mke-1njFShGt8fsFJ5mmyh-t48rnjLMbQNyeBFfmUz3oOCVvRSt0GHJ-nXDqbq9bgrZldbYDPUiQBNckuTBiGt-2Uss1aIWbhj7ELhOfrF3XoFeK2I0mSJ1ERslKeS0wUXtK')
except (HTTPError, URLError) as e:
print(e)
bsObj = BeautifulSoup(html, 'lxml')
for link in bsObj.find('dd', {'class':'desc'}).find_all('a', href=re.compile('^((/view/)*(/subview/)*)((?!:).)*$')):
if 'href' in link.attrs:
print(link.attrs['href'])
else:
print('not in it')
打印内容如下:
高级一点定义一个方法,只需要传入参数
url
即可这次打印时为每个抓取的链接添加上
头
以及内容
def getLinks(url):
try:
html = urlopen(url)
except (HTTPError, URLError) as e:
print(e)
bsObj = BeautifulSoup(html, 'lxml')
return bsObj.find('dd', {'class': 'desc'}).find_all('a', href=re.compile('^((/view/)*(/subview/)*)((?!:).)*$'))
linkTest = getLinks('http://baike.baidu.com/link?url=FfHqPzChV9Iz7Kz0d2Mke-1njFShGt8fsFJ5mmyh-t48rnjLMbQNyeBFfmUz3oOCVvRSt0GHJ-nXDqbq9bgrZldbYDPUiQBNckuTBiGt-2Uss1aIWbhj7ELhOfrF3XoFeK2I0mSJ1ERslKeS0wUXtK')
for link in linkTest:
if 'href' in link.attrs:
print('http://baike.baidu.com' + link.attrs['href'] + ' -- ' + link.get_text())
else:
print('not in it')
- 打印结果如下:
练习抓取百度百科中人物 以及 人物 的老婆 或者 老公 就以 凯文·贝肯
为例子
要抓取的界面链接如图:
打开网页检查查看代码如图:
由于
div
标签的属性class="viewport"
和id="slider_relations
是唯一的则先找到这个目标标签div
--bsObj.find_all('div', {'class': 'viewport','id':'slider_relations'})
紧接着在目标标签
div
下查找标签a
--find_all('a')
,找到后获取href
属性children['href']
并返回.其中不太了解的是 bsObj.find_all('div', {'class': 'viewport','id':'slider_relations'})[0].find_all('a')[0]两个中括号[0]取值是什么原理? 个人理解是
list
-- 角标提取元素得到
凯文·贝肯
他老婆的链接后直接带入方法getLinks(url)
得到凯文·贝肯
,顺便在方法中打印出来各自链接对应的名字print(children.get_text())
# 百度百科夫妻
def getLinks(url):
try:
html = urlopen(url)
except (HTTPError, URLError) as e:
print(e)
bsObj = BeautifulSoup(html, 'lxml')
children = bsObj.find_all('div', {'class': 'viewport','id':'slider_relations'})[0].find_all('a')[0]
print(children.get_text())
return children['href']
newLink = getLinks('http://baike.baidu.com/link?url=FfHqPzChV9Iz7Kz0d2Mke-1njFShGt8fsFJ5mmyh-t48rnjLMbQNyeBFfmUz3oOCVvRSt0GHJ-nXDqbq9bgrZldbYDPUiQBNckuTBiGt-2Uss1aIWbhj7ELhOfrF3XoFeK2I0mSJ1ERslKeS0wUXtK')
print(newLink)
newLinkTwo = getLinks(newLink)
print(newLinkTwo)
- 打印结果如下: