整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:

从网页源代码中提取并验证链接的有效性


在网站维护和数据分析工作中,从网页的HTML源代码中提取链接并检查其有效性是一项常见且重要的任务。无效的链接(即“死链接”)不仅影响用户体验,还可能对网站的搜索引擎排名产生负面影响。因此,识别并处理这些无效链接显得尤为重要。本文将探讨如何从网页的HTML中查找链接,并检查这些链接是否有效,同时输出无效链接。

一、链接提取过程

HTML源代码分析:

介绍如何查看网页的HTML源代码。

解释如何从HTML中识别链接标签,通常是<a>标签。

提取链接:

使用HTML解析工具(如Python的BeautifulSoup库)提取网页中的所有链接。

展示如何从<a>标签的href属性中获取链接。

二、链接有效性检查

检查链接有效性的重要性:

讨论无效链接对网站用户体验和搜索引擎优化的影响。

实现链接有效性检查:

介绍如何使用HTTP请求来检查链接的有效性。

解释如何处理不同类型的HTTP响应状态码,如200表示有效,404表示无效等。

三、实际操作示例

工具选择:

推荐使用的工具,如Python配合BeautifulSoup和requests库。

代码实现:

提供一个简单的Python脚本,演示如何从HTML中提取链接并检查其有效性。

四、案例分析

示例网页分析:

选择一个具有多个链接的示例网页。

展示如何提取链接并进行有效性检查。

结果处理:

展示如何处理检查结果,特别是如何标记和输出无效链接。

五、总结与建议

总结:

强调定期检查网页链接有效性的重要性。

维护建议:

提供网站维护者关于定期检查链接、更新或删除无效链接的建议。

小结

本文提供了一种有效的方法,用于从网页源代码中提取链接并验证其有效性。这对于提高网站的用户体验和搜索引擎排名具有重要意义。通过适当的工具和技术,可以轻松地实现这一过程,保持网站链接的健康和有效性。

示例代码:使用Python检查链接有效性

python

import requests

from bs4 import BeautifulSoup

# 获取网页内容

url = "https://example.com"

response = requests.get(url)

html_content = response.text

# 解析HTML并提取链接

soup = BeautifulSoup(html_content, 'html.parser')

links = [link.get('href') for link in soup.find_all('a') if link.get('href')]

# 检查链接有效性

invalid_links = []

for link in links:

try:

response = requests.head(link, allow_redirects=True, timeout=5)

if response.status_code != 200:

invalid_links.append(link)

except requests.RequestException:

invalid_links.append(link)

# 输出无效链接

print("Invalid Links:", invalid_links)

这段代码首先从指定的网页中提取所有链接,然后逐一检查每个链接的有效性。对于响应状态码不是200的链接,以及在请求过程中出现异常的链接,都被视为无效链接并加以输出。在实际应用中,为了避免对同一个链接进行复的检查,可以对检查过的链接状态进行保存,在下一次的检查中,可以直接套用之前的检查结果。这只是一个简单的示例,可根据实际的要求进行调整。



于parseHTML函数代码实在过于庞大,我这里就不一次性贴出源代码了,大家可以前往(https://github.com/vuejs/vue/blob/dev/src/compiler/parser/html-parser.js)查看源代码。

我们来总结一下该函数的主要功能:

1、匹配标签的 "<" 字符

匹配的标签名称不能是:script、style、textarea

有如下情况:

1、注释标签 /^<!\--/

2、条件注释 /^<!\[/

3、html文档头部 /^<!DOCTYPE [^>]+>/i

4、标签结束 /^<\/ 开头

5、标签开始 /^</ 开头

然后开始匹配标签的属性包括w3的标准属性(id、class)或者自定义的任何属性,以及vue的指令(v-、:、@)等,直到匹配到 "/>" 标签的结尾。然后把已匹配的从字符串中删除,一直 while 循环匹配。

解析开始标签函数代码:

function parseStartTag () {
   // 标签的开始 如<div
    const start = html.match(startTagOpen)
    if (start) {
      const match = {
        tagName: start[1], // 标签名称
        attrs: [], // 标签属性
        start: index // 开始位置
      }
       // 减去已匹配的长度
      advance(start[0].length)
      let end, attr
      while (!(end = html.match(startTagClose)) && (attr = html.match(dynamicArgAttribute) || html.match(attribute))) {
        attr.start = index
        v
        advance(attr[0].length)  
        attr.end = index
        match.attrs.push(attr) // 把匹配到的属性添加到attrs数组
      }
      if (end) { // 标签的结束符 ">"
        match.unarySlash = end[1]
        advance(end[0].length)  // 减去已匹配的长度
        match.end = index  // 结束位置
        return match
      }
    }
  }

处理过后结构如下:

接下来就是处理组合属性,调用 “handleStartTag” 函数

 function handleStartTag (match) {
    const tagName = match.tagName // 标签名称
    const unarySlash = match.unarySlash // 一元标签
    if (expectHTML) {
      if (lastTag === 'p' && isNonPhrasingTag(tagName)) {
        // 解析标签结束
        parseEndTag(lastTag)
      }
      if (canBeLeftOpenTag(tagName) && lastTag === tagName) {
        parseEndTag(tagName)
      }
    }
   // 是否为一元标签
    const unary = isUnaryTag(tagName) || !!unarySlash
    const l = match.attrs.length
    // 标签属性集合
    const attrs = new Array(l)
    for (let i = 0; i < l; i++) {
      const args = match.attrs[i]
      const value = args[3] || args[4] || args[5] || ''
      const shouldDecodeNewlines = tagName === 'a' && args[1] === 'href' ? options.shouldDecodeNewlinesForHref : options.shouldDecodeNewlines
      attrs[i] = {
        name: args[1], // 属性名称
        value: decodeAttr(value, shouldDecodeNewlines) // 属性值
      }
      if (process.env.NODE_ENV !== 'production' && options.outputSourceRange) {
        // 开始位置
        attrs[i].start = args.start + args[0].match(/^\s*/).length
        // 结束位置
        attrs[i].end = args.end
      }
    }

    if (!unary) {
      stack.push({ tag: tagName, lowerCasedTag: tagName.toLowerCase(), attrs: attrs, start: match.start, end: match.end })
      lastTag = tagName
    }
		// 调用start函数
    if (options.start) {
      options.start(tagName, attrs, unary, match.start, match.end)
    }
  }

我们简单说一下最后调用的start函数的作用:

1、判断是否为svg标签,并处理svg在ie下的兼容性问题

2、遍历标签属性,验证其名称是否有效

3、标签名是否为 style 或者 script ,如果在服务端会提示warn警告

4、检查属性是否存在 v-for、v-if、v-once指令

5、如果是更元素就验证其合法性,不能是 slot 和 template 标签,不能存在 v-for指令

以上就是界面html模板的开始标签的分析,接下来我们来分析如何匹配结束标签。

请看:Vue源码全面解析三十 parseHTML函数(解析html(二)结束标签)

如有错误,欢迎指正,谢谢。

.网站SEO优化常用标签之TDK标签

TDK对每个SEOer来说都是熟悉的不能再熟悉的html标签了.TDK分别表示Title、Keywords和Description三大最常见的优化标签。Title页面标题,keywords页面关键词、description页面描述。

百度算法更新后,除Title标签外,Keywords、Description不参与排名,但是Description,严格意义上来说是除了title,其他两个均为mate标签的属性。

2.网站SEO优化常用标签之heading标签

heading标签也就是大家经常说的H标签,它是对页面总要部分的强调,一般用在标题、小标题、栏目名称上。heading标签从h1到h6共6对,强调程度递减,经常使用的是h1、h2、h3这三个heading标签,由于h4、h5、h6的强调作用较小以至可以忽略所有在网站优化SEO中基本上用不到。

h1标签是对页面最重要部分的强调,一般用在页面标题上。需要注意的是在同一个页面中h1标签只能出现一对,若在页面中出现多个H1标签将对SEO造成不利影响,而且h1到h6必须以正序的方式出现,按顺序排列如:h1、h2、h3、h4,但不可以h3、h2这样倒序出现。

h2、h3及其他heading标签在同一页面中均可使用多次,一般使用在栏目名称、文章段落标题或小标题中。

虽然heading标签对网站优化有着积极的影响,但如果乱用同样会带来不利的后果,切忌将heading标签用在整段内容中。

3.网站优SEO化常用标签之nofllow属性

nofllow只是html标签的一个属性,一般可用于除友情链接以外的出站链接,。通常认为使用了nofllow属性的链接不会被搜索引擎跟踪(该观点有争议),更不会给链接页面传递权重。最常用的方式是使用nofllow属性来避免页面权重不必要的流失从而达到权重集中的目的。

写法:<a rel="nofollow" href="url">锚文本</a>

4.网站SEO优化常用标签之mate标签

通常所说的META标签,是在HTML网页源代码中一个重要的html标签。META标签用来描述一个HTML网页文档的属性,例如作者、日期和时间、网页描述、关键词、页面刷新等。大家所熟知的TDK标签都是mate标签的属性。mate标签在优化中的3个作用:

作用一:承载Keywords和Description属性内容,是页面优化不可或缺的元素。

作用二:进行PC站和移动站适配标注,mate标签肩负着移动适配的重任。

作用三:对单个网页进行301跳转,可用于页面集权及网站改版。

常见写法:页面关键词  <meta name="keywords" content="your tags" />页面描述  <meta name="description" content="150 words" />搜索引擎索引方式  <meta name="robots" content="index,follow" />

5.网站SEO优化常用标签之alt属性

在网站优化中,alt属性主要用在img标签中。在img表中添加alt属性一是为了通过alt属性对图片进行说明,告诉搜索引擎图片的含义;二是为了提高用户体验,在img缺少title属性时当鼠标移动到图片上展现的文字信息即为alt属性内容;再就是当由于某种原因图片不能正常显示时,alt属性中的文字将替代图片进行展示。

以上5个是较为常用的标签,在网站seo优化过程中会用到很多的html标签、属性。