代码如下
import ssl from urllib import request from lxml import etree def urllibGet(url): # 取消全局证书验证 ssl._create_default_https_cOntext= ssl._create_unverified_context headers = { 'Host': 'www.livesoccertv.com', 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:77.0) Gecko/20100101 Firefox/77.0', } res = request.Request(url=url, headers=headers) res = request.urlopen(res) return res.read().decode('utf-8') res = urllibGet('https://www.livesoccertv.com/match/4027329/aston-villa-vs-tottenham-hotspur/') html = etree.HTML(res) channel_list = html.xpath('//table[@id="wc_channels"]') html_str = etree.tostring(channel_list[0], encoding='utf-8').decode() open('content.html', 'w').write(html_str)
是我哪里写错了吗?
1 tg11 OP 测试过其它网站了,这样写没有任何问题 |
2 phpfpm 2022-04-10 19:54:37 +08:00 标签没写好没闭合呗。。。 |
3 ec0 2022-04-10 19:59:22 +08:00 ![]() 我这边复现了你的问题 于是我 ctrl+u 看了一下这个网页的源代码,发现这个网页的第一句是 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 而一般网页(比如 V2EX )是 <!DOCTYPE html> 于是我跳过了这个注释,就能够正常获取 table 了 也就是把 html = etree.HTML(res) 改成 html = etree.HTML(res[121:]) 121 是 DOCTYPE 的长度 |
5 Kobayashi 2022-04-19 11:53:49 +08:00 应该就是 HTML 文件不符合规范。可以在 tostring 时正确截断: etree.tostring(method='xml') 建议直接使用 html 而不是 etree 。from lxml import html, html.fromstring(), html.tostring()。 不确定有没有办法在 parse 时搞定,上面方法应该是在输出时作了校验。 |