我想用python解析从html读取典型数据

时间:2018-07-18 10:29:49

标签: python html regex api parsing

我尝试使用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")

下面的文字是汤的一部分,它是从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)

谢谢您的建议。

1 个答案:

答案 0 :(得分:0)

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

{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']

总而言之,您应该使用捕获组,并确保使用正确的重复说明符,这是示例regexp,应该对您有用:

>>> 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。