python⽣成⽹页树形节点_python爬⾍中html如何转换树形结
构?
经过⼀段时间的python学习,我们知道提取数据的来源不⽌是⽹页,就像抓取数据可以选择很多种库⼀样。在python中,BeautifulSoup 和HTMLParser虽然看起来不相似,但在使⽤上是⽐较相像的。今天就html转换树形结构,⼩伙伴们可以尝试着⽤此类⽅法去解决,其中涉及到的新知识点我们都会额外为⼤家进⾏讲解。
BeautifulSoup就是⼀个专门⽤来从html和xml⽂档中提取数据的库,现在的版本是bs4。除了BeautifulSoup之外,python还具有⼀些其它的库,如HTMLParser等,作⽤都差不多。解析器结合正则表达式,很容易将我们所需要的内容提取出来。
⾸先安装BeautifulSoup:$pip install beautifulsoup4
在python环境下导⼊字符串,创建BeautifulSoup对象:from bs4 import BeautifulSoup
soup = BeautifulSoup(html_str, 'lxml', from_encoding='utf-8')BeautifulSoup可以将复杂的html⽂档转化成树形结构,每个节点都是pyhton对象,所有的对象可以归纳为4种:
Tag
NavigableString
BeautifulSoup
Comment
HtmlParser将要接收⼀个字符串,输出data和新采集到的⼀些urls。之前写过的add_new_urls()函数接受⼀个可迭代对象,所以这⾥新的urls我们采⽤集合的形式(也可采⽤列表的形式)返回,data采⽤字典的形式存储并返回。
此外,我们观察到,词条内容中含有的链接为"/item/..."的形式,这并不是⼀个完整的url,要在前⾯加上“baike.baidu”进⾏补全,利⽤urlparse模块可以很⽅便地完成这个任务(当然也可以使⽤拼接字符串的⽅式)。
下⾯就是HtmlParser的完整代码:'''
-----------------------------------------------------------------
HtmlParser
'''
import re #正则表达式模块
import urlparse #⽤来拼接url
from bs4 import BeautifulSoup
class HtmlParser(object):
def parser(self, page_url, html_cont):
'''
python 爬虫教学解析器主函数
parm page_url:⼀个url
parm html_cont:⽹页内容,格式为字符串
return: urls, 数据;格式为 set, dict
'''
if page_url is None or html_cont is None:
print "page_url is None"
return
#建⽴bs对象,使⽤html.parser进⾏解析
soup = BeautifulSoup(html_cont, 'html.parser', from_encoding='urf-8') print "soup established"
#接下来分别调⽤两个私有函数返回urls和data
new_urls = self._get_new_urls(page_url, soup)
print "new_urls get"
new_data = self._get_new_data(page_url, soup)
print "new_data get"
return new_urls, new_data
def _get_new_urls(self, page_url, soup):
'''
从页⾯中抽取指向其他词条的链接
parm page_url: 当前页⾯url
parm soup: beautifulsoup对象
return: 新url的set
'''
new_urls = set()
#根据正则表达式规则对页⾯内的链接进⾏筛选,留下想要的链接
links = soup.find_all('a', href=repile(r'/item/.+'))
for link in links:
#每个link都是Tag对象,Tag对象的操作⽅法与字典相同
new_url = link['href']
#借助urljoin,可以很⽅便地拼接url
new_full_url = urlparse.urljoin(page_url, new_url)
new_urls.add(new_full_url)
return new_urls
def _get_new_data(self, page_url, soup):
'''
提取想要的数据
parm page_url: 当前页⾯url
parm soup: beautifulsoup对象
return: dict
'''
#声明字典
data = {}
data['url'] = page_url
data['title'] = soup.find('dd', class_='lemmaWgt-lemmaTitle-title').find('h1').get_text()
data['summary'] = soup.find('div', class_='lemma-summary').get_text()
return data
相信经过本篇的学习,⼩伙伴们已经掌握了BeautifulSoup和HtmlParser的使⽤,毕竟⼆者相似的地⽅很多,在html转换树形结构的问题上也能够很好的处理。更多Python学习指路:PyThon学习⽹教学中⼼。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论