返回介绍

6.4 HTML 解析器

发布于 2024-01-26 22:39:51 字数 2294 浏览 0 评论 0 收藏 0

HTML解析器使用BeautifulSoup4进行HTML解析。需要解析的部分主要分为提取相关词条页面的URL和提取当前词条的标题和摘要信息。

先使用Firebug查看一下标题和摘要所在的结构位置,如图6-4所示。

图6-4 HTML结构位置

从上图可以看到标题的标记位于<dd class=“lemmaWgt-lemmaTitle-title”><h1></h1>,摘要文本位于<div class=“lemma-summary”label-module=“lemmaSummary”>。

最后分析一下需要抽取的URL的格式。相关词条的URL格式类似于<a target=“_blank”href=“/view/7833.htm”>万维网</a>这种形式,提取出a标记中的href属性即可,从格式中可以看到href属性值是一个相对网址,可以使用urlparse.urljoin函数将当前网址和相对网址拼接成完整的URL路径。

HTML解析器主要提供一个parser对外接口,输入参数为当前页面的URL和HTML下载器返回的网页内容。解析器HtmlParser.py程序的代码如下:

  # coding:utf-8
  import re
  import urlparse
  from bs4 import BeautifulSoup
  
  
  class HtmlParser(object):
  
     def parser(self,page_url,html_cont):
       '''
       用于解析网页内容,抽取URL和数据
       :param page_url: 下载页面的URL
       :param html_cont: 下载的网页内容
       :return:返回URL和数据
       '''
       if page_url is None or html_cont is None:
            return
       soup = BeautifulSoup(html_cont,'html.parser',from_encoding='utf-8')
       new_urls = self._get_new_urls(page_url,soup)
       new_data = self._get_new_data(page_url,soup)
       return new_urls,new_data
  
  
     def _get_new_urls(self,page_url,soup):
       '''
       抽取新的URL集合
       :param page_url: 下载页面的URL
       :param soup:soup
       :return: 返回新的URL集合
       '''
       new_urls = set()
       # 抽取符合要求的a标记
       links = soup.find_all('a',href=re.compile(r'/view/\d+\.htm'))
       for link in links:
            # 提取href属性
            new_url = link['href']
            # 拼接成完整网址
            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):
       '''
       抽取有效数据
       :param page_url:下载页面的URL
       :param soup:
       :return:返回有效数据
       '''
       data={}
       data['url']=page_url
       title = soup.find('dd',class_='lemmaWgt-lemmaTitle-title').find('h1')
       data['title']=title.get_text()
       summary = soup.find('div',class_='lemma-summary')
       # 获取tag中包含的所有文本内容,包括子孙tag中的内容,并将结果作为Unicode字符串返回
       data['summary']=summary.get_text()
       return data

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文