使用lxml解析本地html文件报错?

场景说明

使用 lxml 中的 parse 方法读取本地 html 文件报错,遇到这种问题该怎么解决呢?

python 复制代码
from lxml import etree


response = etree.parse('test.html')
tr_list = response.xpath('//table[@class="list-table"]/tbody/tr[not(@id)][position()>1]')
print(tr_list)

报错:

复制代码
Traceback (most recent call last):
  File "C:\Users\admin\Desktop\chipsmall\instock\spiders\test.py", line 39, in <module>
    main1()
  File "C:\Users\admin\Desktop\chipsmall\instock\spiders\test.py", line 5, in main1
    response = etree.parse('test.html')
               ^^^^^^^^^^^^^^^^^^^^^^^^
  File "src\lxml\etree.pyx", line 3541, in lxml.etree.parse
  File "src\lxml\parser.pxi", line 1879, in lxml.etree._parseDocument
  File "src\lxml\parser.pxi", line 1905, in lxml.etree._parseDocumentFromURL
  File "src\lxml\parser.pxi", line 1808, in lxml.etree._parseDocFromFile
  File "src\lxml\parser.pxi", line 1180, in lxml.etree._BaseParser._parseDocFromFile
  File "src\lxml\parser.pxi", line 618, in lxml.etree._ParserContext._handleParseResultDoc
  File "src\lxml\parser.pxi", line 728, in lxml.etree._handleParseResult
  File "src\lxml\parser.pxi", line 657, in lxml.etree._raiseParseError
  File "test.html", line 83
lxml.etree.XMLSyntaxError: Opening and ending tag mismatch: link line 71 and head, line 83, column 347

报错原因

  • 根据报错信息,看起来是在解析HTML文件时出现了语法错误。具体错误是在test.html文件的第83行,link标签的开启和结束标签不匹配。
  • 这个错误可能是由于HTML文件本身存在语法问题导致的。你可以打开test.html文件,检查第83行的代码,确保link标签的开启和结束标签是正确匹配的。修复HTML文件中的语法错误后,再次运行代码应该就不会报错了。

解决方法

对于这种 HTML 文件不规范导致的报错有什么好的解决方法呢?

原则上对于这种 HTML 文件不规范导致的报错,修复 HTML 文件中的错误即可解决。但是这需要对 HTML 语法有基本的了解,并且如果有多个文件,每个文件错误的地方有可能不同,如果要修复文件就需要花费大量的精力!那么有什么更好的方法吗?

以下是更好的解决方法,如果遇到类似的问题可以参考:

python 复制代码
from lxml import etree


html_content = open('test.html', 'r', encoding='utf8').read()
parser = etree.HTMLParser()
tree = etree.fromstring(html_content, parser)

tr_list = tree.xpath('//table[@class="list-table"]/tbody/tr[not(@id)][position()>1]')
for otr in tr_list:
    web_product = otr.xpath('./td[@class="td-model"]/div/div/a/text()')[0]
    brand = otr.xpath('./td[@class="td-brand"]/div/text()')[0].strip()
    icon = otr.findtext('./td[@class="td-model"]/div/a/i', default=None)
    supplier = otr.xpath('./td[@class="j-company-td"]/p/a/text()')[0].strip()
    batch = otr.findtext('./td[@class="td-pproductDate"]/p', default=None)
    number = otr.findtext('./td[@class="td-stockNum"]/p[1]', default=None)
    package = otr.findtext('./td[@class="td-ppackage"]/p[1]', default=None)
    date = otr.xpath('./td[14]/p/text()')[0].strip()
    result = {
        'supplier': supplier,
        'product': web_product,
        'icon': icon,
        'brand': brand,
        'batch': batch,
        'number': number,
        'package': package,
        'date': date
    }
    print(result)

注意:该方法也适合读取网络文件,如:

python 复制代码
import requests
from lxml import etree

url = "https://example.com/test.html"

response = requests.get(url)
html_content = response.text

parser = etree.HTMLParser()
tree = etree.fromstring(html_content, parser)
tr_list = tree.xpath('//table[@class="list-table"]/tbody/tr[not(@id)][position()>1]')
print(tr_list)
相关推荐
顾安r3 小时前
11.21 脚本 网页优化
linux·前端·javascript·算法·html
合作小小程序员小小店4 小时前
web开发,在线%药店管理%系统,基于Idea,html,css,jQuery,java,ssm,mysql。
java·前端·mysql·jdk·html·intellij-idea
傻啦嘿哟4 小时前
Python实现PDF文档高效转换为HTML文件:从基础到进阶的完整指南
python·pdf·html
bank_dreamer6 小时前
VSCODE前端代码风格格式化
前端·css·vscode·html·js·prettier·代码格式化
烤汉堡7 小时前
Python入门到实战:post请求和响应
python·html
合作小小程序员小小店8 小时前
网页开发,在线%宠物论坛管理%系统,基于eclipse,html,css,jquery,servlet,jsp,sql server数据库。
java·sqlserver·eclipse·jdk·html·intellij-idea
BUG创建者9 小时前
项目中使用script-ext-html-webpack-plugin
前端·webpack·html
小莫分享10 小时前
Github Action 一键部署HTML 静态服务
前端·html·github
じòぴé南冸じょうげん14 小时前
若依框架favicon.ico缓存更新问题解决方案:本地生效但线上未更新
前端·javascript·前端框架·html
骨子里的偏爱1 天前
【案例】uniapp实现内部信息与外部的html网页双向通信的完整的过程,附加完整的代码部分
前端·uni-app·html