【问题标题】:I want to read typical data from html with python parsing我想用python解析从html中读取典型数据
【发布时间】:2018-07-18 10:29:49
【问题描述】:

我尝试使用api读取公司财务数据。

所以我访问了 html 数据,我想用 python 解析 html 数据,但我不知道如何读取典型数据。有代码可以给我html数据

url = "http://dart.fss.or.kr/api/search.json?auth="+API_KEY \
  +"&crp_cd="+company_code + "&page_set=100" \
  +"&start_dt=19990101&bsn_tp=A001&bsn_tp=A002&bsn_tp=A003"

json_data = requests.get(url).json()
list = json_data['list']

data = pd.DataFrame.from_dict(list)

url2 = "http://dart.fss.or.kr/dsaf001/main.do?rcpNo="+data['rcp_no'][0]


print("Total number of report : ", json_data['total_count'])

temp = requests.get(url2)

html = temp.text

soup = BeautifulSoup(html, "html.parser")

下面的文字是soup的一部分,是我从api得到的html信息。

treeNode2 = new Tree.TreeNode({
        text: "3. asset",
        id: "6",
        cls: "text",
        listeners: {
            click: function() {viewDoc('20180515000480', '6177478', '6', '58846', '899', 'dart3.xsd');}
        }
    });
    cnt++;

我想阅读

6177478

来自

{viewDoc('20180515000480', '6177478', '6', '58846', '899', 'dart3.xsd');}

我认为正则表达式将有助于检测数据。但是,我根本没有使用过正则表达式,所以请帮助我。

** 这段代码是我试图读取数据的,但根本不起作用。

pattern = re.compile(r'\.viewDoc\("\d", "\d", "\s", "\s", "\w", "\w")', re.MULTILINE | re.DOTALL)

script = soup.find_all(pattern)

感谢您的建议。

【问题讨论】:

    标签: python html regex api parsing


    【解决方案1】:

    首先,我看到您的正则表达式使用的引号与输入不同。这里

    {viewDoc('20180515000480', '6177478', '6', '58846', '899', 'dart3.xsd');}
    

    ' 并且在您的正则表达式中是 " - 这将不匹配。

    其次 - 在您的示例中使用的 \d character class 只会匹配一个字符。如果您知道要匹配的字符数,则可以像这样指定重复:

    • \d{1,4} 1 到 4 个字符 - 0129 会匹配,但 1123445682 不会匹配,因为它太长了
    • \d{1,} 一个或多个字符 - 写得更好\d+
    • \d{0,} 零个或多个字符 - 写得更好\d*

    您可以阅读更多关于 repetition in Python docs 的信息(我真的认为他们很棒!)。

    此外,需要在此处指定 capturing group,因此当您使用长正则表达式时,只会返回组中的内容。 这是如何工作的简单示例

    >>> p = re.compile(r'\b(\d+)\b')
    >>> p.findall('my lucky number is 13 not 7')
    ['13', '7']
    

    如果您只想匹配第二个数字(就像您的情况一样),您可以在编写正则表达式时使用上下文知识:

    >>> p = re.compile(r'\d+ not (\d+)')
    >>> p.findall('my lucky number is 13 not 7')
    ['7']
    

    总而言之,您应该使用捕获组并确保使用正确的重复说明符,以下是适合您的示例正则表达式:

    >>> string = "{viewDoc('20180515000480', '6177478', '6', '58846', '899', 'dart3.xsd');}"
    >>> pattern = re.compile(r'viewDoc\(\'\d+\', \'(\d+)\', .+\)', re.MULTILINE | re.DOTALL)
    >>> pattern.findall(string)
    ['6177478']
    

    编辑: 另外,对于 BeautifulSoup,我建议使用他们的方法 find_all(),例如 they show in the docs

    soup.find_all(string=pattern)
    

    引用文档以阐明其作用(强调我的):

    使用string,您可以搜索字符串而不是标签。 (...) 您可以传入字符串、正则表达式、列表、函数或值 True。

    【讨论】:

    • 感谢您的建议。我尝试使用 编写您的代码,然后我可以得到我想要的。但是,如果我使用 soup.find_all(string = pattern) 运行代码,我将无法获取信息,并且我从原始 html 文本中获得了很多字符串。我也无法理解“.+\”标记。 Beautifulsoup 模块有什么问题?
    • 我今天发现我需要你写成字符串的所有内部信息,'6177478'、'6'、'58846'、'899'、'dart3.xsd'。但是html中有很多类似的格式数据,因为不同的数字意味着不同的附加文件。那么如何区分典型行和整个html。
    • 您能否提供更多信息(如示例输出)?我怀疑问题可能出在(正则表达式的贪婪)[regular-expressions.info/repeat.html].基本上它是关于匹配符合模式的最长和最短字符串之间的差异。 .+ 表示“任何字符 1 次或多次” - 所以这可能是问题所在。这可以更改为看起来更像您的原始正则表达式(这可能是这里最好的解决方案)。
    • 在评论区写太长了.. :( 对不起,我写了另一个问题并附有示例。这里是链接 [stackoverflow.com/questions/51493468/…],代码打印的一些关键字不是英文..所以我认为阅读起来会有些困难..
    • 我写的树节点与其他值重复。所以我想从python中找到典型值
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-05-04
    • 1970-01-01
    • 2019-04-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-07
    相关资源
    最近更新 更多