【爬虫】学习:页面智能解析

python3网络爬虫开发实战第二版——14
GitHub

基础

详情页

url:https://news.ifeng.com/c/8COcKDt6PTg

提取title

from lxml.html import HtmlElement, fromstring

# 将html代码里面的字符转化为lxml里面的HtmlElement对象
html = open('detail.html', encoding='utf-8').read()
element = fromstring(html=html)

# xpath从meta节点中提取标题的规则
METAS = [
    '//meta[starts-with(@property,"og:title")]/@content',
    '//meta[starts-with(@name,"og:title")]/@content',
    '//meta[starts-with(@property,"title")]/@content',
    '//meta[starts-with(@name,"title")]/@content',
    '//meta[starts-with(@property,"page:title")]/@content',
]


def extract_by_meta(element: HtmlElement) -> str:
    for xpth in METAS:
        title = element.xpath(xpth)  # 返回匹配得到的数据,匹配不成功返回None
        if title:
            return ''.join(title)


def extract_by_title(element: HtmlElement):
    return ''.join(element.xpath('//title//text()')).strip()


def extract_by_h(element: HtmlElement):
    hs = element.xpath('//h1//text()|//h2//text()|//h3//text()')  # 返回一个列表
    return hs or []


# title_extracted_by_meta=extract_by_meta(element)
# title_extracted_by_h=extract_by_h(element)
# title_extracted_by_title=extract_by_title(element)
#
# print(title_extracted_by_meta)
# print(title_extracted_by_h)
# print(title_extracted_by_title)
"""
美“2022国防授权法案”含多项涉华消极条款 国防部回应
['美“2022国防授权法案”含多项涉华消极条款 国防部回应', '为您推荐', '精品有声', '好书精选']
美“2022国防授权法案”含多项涉华消极条款 国防部回应_凤凰网
"""

"""
最基本的字符串相似度算法 Jaccard算法
用两个字符串的交集字符数量除以两个字符串的并集字符数量
如果s1和s2完全相同,则返回1
如果s1和s2毫不相干,则返回0

局限性:没有考虑字符的数量和重复度
"""


def similarity(s1, s2):
    if not s1 or not s2:
        return 0
    s1_set = set(list(s1))  # 将字符拆分成集合
    s2_set = set(list(s2))
    intersection = s1_set.intersection(s2_set)
    union = s2_set.intersection(s2_set)
    return len(intersection) / len(union)


# 提取title
def extract_title(element: HtmlElement):
    title_extracted_by_meta = extract_by_meta(element)
    title_extracted_by_h = extract_by_h(element)
    title_extracted_by_title = extract_by_title(element)

    if title_extracted_by_meta:
        return title_extracted_by_meta
    title_extracted_by_h = sorted(title_extracted_by_h,
                                  key=lambda x: similarity(x, title_extracted_by_title),
                                  reverse=True)
    if title_extracted_by_h:
        return title_extracted_by_h[0]

    return title_extracted_by_title


print(extract_title(element))
# 美“2022国防授权法案”含多项涉华消极条款 国防部回应


调包

注意:gerapy-auto-extractor 0.2.0 requires scikit-learn>=0.23.1

from gerapy_auto_extractor import extract_detail
from gerapy_auto_extractor.helpers import content,jsonify

html=content('detail.html')
print(jsonify(extract_detail(html)))
{
  "title": "美“2022国防授权法案”含多项涉华消极条款 国防部回应",
  "datetime": "2021-12-30 15:08:52",
  "content": "12月30日下午,国防部举行例行记者会,国防部新闻局副局长、国防部新闻发言人谭克非大校答记者问。\n记者:\n美国当地时间12月27日,美总统签署“2022年国防授权法案”,其中包括多项涉华内容,请问发言人对此有何评论?\n谭克非:\n美近日出台包含多项涉华消极条款的“2022年国防授权法案”。该法案充斥冷战思维和意识形态偏见,渲染“中国威胁论”,极力抹黑中国国防政策和军力发展,在台湾、涉疆等问题上对中方无端指责,鼓噪在亚太、拉美等地区加强对华遏制,煽动开展对华经贸、科技竞争,诋毁中国同有关国家正常交流合作。该法案严重干涉中国内政,严重损害中国国家主权、安全、发展利益,严重损害中美互信,严重毒化中美两国两军关系,中方对此表示强烈不满和坚决反对。\n中国一贯坚持和平发展道路和防御性国防政策,始终是世界和平的建设者、全球发展的贡献者、国际秩序的维护者、公共产品的提供者。反观美方,多年来频繁对他国发动战争,造成大量平民伤亡和流离失所,是地区和世界和平与稳定的最大威胁。美方粗暴干涉中国内政、渲染中国威胁、抹黑中国发展、强调对华竞争,实际上是在把两国两军关系带入危险的境地。\n中方敦促美方摒弃零和博弈观念,客观理性看待中国国防和军队建设,停止出台敌视性对华政策,停止将中方塑造成为美方的对手甚至敌人,多做有利于两国两军关系健康稳定发展的事。"
}

列表页

url:https://news.ifeng.com/

调包

from gerapy_auto_extractor import extract_list
from gerapy_auto_extractor.helpers import content,jsonify

html=content('list.html')
print(jsonify(extract_list(html)))
[
  {
    "title": "今年940余架次军机进入台“空域”?国防部:只多不少",
    "url": "http://mil.ifeng.com/c/8COiCgCf1Xe"
  },
  {
    "title": "男子护妹持锹拍死妹夫获无罪诉请返还赔偿金再次被驳",
    "url": "http://news.ifeng.com/c/8COgLGB8IJh"
  },
  {
    "title": "赵立坚:在座外国记者能在疫情期间生活在中国你们就偷着乐吧",
    "url": "http://news.ifeng.com/c/8COiI9rhKWU"
  },
  ...
]

智能辨别列表页和详情页

from gerapy_auto_extractor import is_detail, is_list, probability_of_list, probability_of_detail
from gerapy_auto_extractor.helpers import content, jsonify

html = content('detail.html')
print(probability_of_detail(html),probability_of_list(html))
print(is_detail(html),is_list(html))

html = content('list.html')
print(probability_of_detail(html),probability_of_list(html))
print(is_detail(html),is_list(html))

'''
0.9960569412361125 0.003943058763887429
True False
0.008709616361285866 0.9912903836387141
False True
'''
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值