从“<a href=”中提取内容数据:文本/csv;…内容">

2024-04-24 06:40:57 发布

您现在位置:Python中文网/ 问答频道 /正文

有一个带有CSV内容的html标记<a>的字符串值:

href = "data:text/csv;charset=UTF-8,%22csvcontentfollows"

有没有一种方法可以通过标准模块(requests、lxml、pure python)的方法来获取CSV内容而不必这样的meta头data:text/csv;charset=UTF-8?你知道吗

我不想使用手动文本解析(通过regexp、index/startswith、split/partition)。你知道吗

更新:

谢谢,我知道如何使用html。我的问题是关于这样的元头。我重新制定了计划。你知道吗


Tags: 模块csv方法字符串text标记内容data
1条回答
网友
1楼 · 发布于 2024-04-24 06:40:57

这里有三种可能的解决办法。第一种使用本机Pythonurllib.request.urlopen功能。第二个使用第三方库lxml。第二个使用来自本机的HTMLParser类html.parser语法分析器模块。第二个和第三个使用第三方库来解析data URLs,称为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'}]

相关问题 更多 >