问题描述
解决方案
以下是三种可能的解决方案。第一个使用原生 Python urllib.request.urlopen 函数。第二个使用第三方库lxml。第二个使用来自本机 html.parser 模块的 HTMLParser 类。第二个和第三个使用第三方库来解析数据 URL ,称为python-datauri
html_string = """
<a href="data:text/csv;charset=UTF-8,%22csvcontentfollows">
<a href="data:text/csv;charset=UTF-8,%22csvcontentfollows">
<a href="data:text/csv;charset=UTF-8,%22csvcontentfollows">
"""
from contextlib import ExitStack
from urllib.request import urlopen
import lxml.etree
HREF = "href"
tree = lxml.etree.fromstring(html_string, lxml.etree.HTMLParser())
uris = (
item.attrib[HREF]
for item in tree.iterdescendants()
if HREF in item.attrib
)
with ExitStack() as stack:
resources = (stack.enter_context(urlopen(uri)) for uri in uris)
data = [fh.read().decode() for fh in resources]
print(data)
输出:
['csvcontentfollows', 'csvcontentfollows', 'csvcontentfollows']
import lxml.etree
from datauri import DataURI
tree = lxml.etree.fromstring(html_string, lxml.etree.HTMLParser())
HREF = "href"
uris = (
DataURI(item.attrib[HREF])
for item in tree.iterdescendants()
if HREF in item.attrib
)
attrs = ("mimetype", "charset", "is_base64", "data")
print([{attr: getattr(uri, attr) for attr in attrs}
for uri in uris])
输出:
[{'mimetype': 'text/csv', 'charset': 'UTF-8', 'is_base64': False, 'data': 'csvcontentfollows'}, {'mimetype': 'text/csv', 'charset': 'UTF-8', 'is_base64': False, 'data': 'csvcontentfollows'}, {'mimetype': 'text/csv', 'charset': 'UTF-8', 'is_base64': False, 'data': 'csvcontentfollows'}]
from html.parser import HTMLParser
from datauri import DataURI
uri_attrs = ("mimetype", "charset", "is_base64", "data")
class MyHTMLParser(HTMLParser):
def __init__(self):
super().__init__()
self.data = []
def handle_starttag(self, tag, attrs):
if tag == "a":
for attr, value in attrs:
if attr == "href":
for key, value in attrs:
uri = DataURI(value)
self.data.append({attr: getattr(uri, attr) for attr in uri_attrs})
parser = MyHTMLParser()
parser.feed(html_string)
print(parser.data)
输出:
[{'mimetype': 'text/csv', 'charset': 'UTF-8', 'is_base64': False, 'data': 'csvcontentfollows'}, {'mimetype': 'text/csv', 'charset': 'UTF-8', 'is_base64': False, 'data': 'csvcontentfollows'}, {'mimetype': 'text/csv', 'charset': 'UTF-8', 'is_base64': False, 'data': 'csvcontentfollows'}]
推荐阅读
- java - 删除子 pom.xml 中重复的依赖项会引入错误,因为依赖项位于父 pom.xml 中
- sql - 随机样本组
- neo4j - 在图上隐藏递归关系
- php - 如何从 Twig 收集数据?
- laravel - 如何在方法返回视图的地方扩展 Laravel 类
- java - 如何防止将字符串转换为int导致的数字格式异常
- javascript - Discord.js 禁止/踢命令可供所有用户使用。我怎样才能解决这个问题?
- python - 将多个(字符串)清理函数应用于大型 pandas 数据帧的最佳方法
- amazon-web-services - Go AWS 测试无效登录
- c# - 从通用 Windows 应用程序将 CSV 文件写入运行 Windows 10 IoT 的 C:\temp