python爬虫中html转换树形结构的示例
创始人
2024-11-21 04:20:57
0次

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,要在前面加上“https://baike.baidu.com”进行补全,利用urlparse模块可以很方便地完成这个任务(当然也可以使用拼接字符串的方式)。

下面就是HtmlParser的完整代码:

'''
-----------------------------------------------------------------
HtmlParser
'''
import re    #正则表达式模块
import urlparse    #用来拼接url
from bs4 import BeautifulSoup
 
class HtmlParser(object):
    def parser(self, page_url, html_cont):
        '''
        解析器主函数
        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=re.compile(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('h2').get_text()
        data['summary'] = soup.find('div', class_='lemma-summary').get_text()
 
        return data

相关内容

热门资讯

空调连续工作多久需要停机休息 空调连续工作的时间取决于多个因素,包括空调的型号、功率、使用环境和维护情况等。一般来说,空调可以连续...
空调哪个符号是除湿的 空调除湿功能通常用一个水滴形状的符号表示。不同品牌和型号的空调遥控器可能会有所差异,但一般来说,除湿...
格力空调多长时间加一次氟利昂 1、一般情况下,空调对氟利昂的使用量是非常小的,所以在空调使用了四年左右的时候再考虑加也没问题。2、...
空调用多长时间需要加氟一次 一般情况下是五年。当出现以下这几种情况时,空调才需要加氟。1、空调的室内机和室外机各有两个接口,当接...
格调生活·C标思享荟:卡萨帝在... 9月12日的郑州龙湖金融岛,夜风轻拂,灯光璀璨。“C标时刻共传奇——卡萨帝思享荟暨20周年品牌盛典郑...
品牌价值破千亿、高端份额持续领... 9月12日,“C标时刻共传奇——卡萨帝思享荟暨20周年品牌盛典郑州站”在郑州龙湖金融岛举办。2026...
空调主板坏了修800还是换新的 空调主板坏了是修还是换新,需要考虑多个因素,以下是一些建议:1. 维修成本:如果维修费用较低,比如 ...
空调开多久需要休息多长时间 问题:空调开多久需要休息多长时间回答:1、在使用空调的过程中,一般空调开7~8个小时左右需要休息2~...
中央空调多长时间清洗一次 1、一般空调开机前清洗一次即可,空调开机中间时段再清洗一次,空调关机时清洗一次,这样比较合理。2、空...
中央空调氟利昂多久加一次 看空调制热和制冷程度,很多人的观点认为氟利昂必须一年放一次,其实这个观点是错误的,理解上面有点偏差,...