美文网首页
使用js2xml获取javascript中的变量

使用js2xml获取javascript中的变量

作者: ivms8200 | 来源:发表于2020-01-04 15:06 被阅读0次

有时候爬数据遇到像下面这种,数据在script标签中以javascript形式存在。

一般我们都是通过正则的方式抽取,其实还可以使用js2xml。将js转换为xml标记的文本,这样就可以通过抽取。

js文本如下

<script>
  var p4p_btsinfo = "";
  var g_config = {
  appId: 3,
  toolbar: false,
  webww: true,
  footer: false,
  ap_mods: {
    jstracker: [0.0001]
  }
  };
</script>

js2xml

这里要说下:
有的网页用soup = BeautifulSoup(r.content, 'lxml')会出错,我解析了两个接口,另一个接口使用soup = BeautifulSoup(r.text, 'html.parser')来获取soup.我把这行代码也放下面了,如果报错的话最好debug下,看看是为什么错了.

r = requests.get(url, headers=headers)
soup = BeautifulSoup(r.content, 'lxml')
# soup = BeautifulSoup(r.text, 'html.parser')
src = soup.select('head script')[0].string
src_element = js2xml.parse(src, encoding='utf-8', debug=False)

为了方便我们查看Element对象,使用下面的代码:

print(js2xml.pretty_print(src_element))

打印我们熟悉的标记语言字符串。

<program>
  <var name="p4p_btsinfo">
    <string></string>
  </var>
  <var name="g_config">
    <object>
      <property name="appId">
        <number value="3"/>
      </property>
      <property name="toolbar">
        <boolean>false</boolean>
      </property>
      <property name="webww">
        <boolean>true</boolean>
      </property>
      <property name="footer">
        <boolean>false</boolean>
      </property>
      <property name="ap_mods">
        <object>
          <property name="jstracker">
            <array>
              <number value="0.0001"/>
            </array>
          </property>
        </object>
      </property>
    </object>
  </var>
</program>

因为parse_js是lxml库的Element类对象。如果我们熟悉lxml库的话,应该知道可以使用xpath或者css定位数据。

我们想获取name=g_config节点里的appId节点中的value属性的值。获取节点属性值可以参考 python中使用XPath

number = src_element.xpath("//program/var[@name='g_config']/object/property[@name='appId']/number/@value")
print(number[0])
3

完整代码如下

cookie和user-agent参数已删除,请自行登陆后获取

import requests
from bs4 import BeautifulSoup
import js2xml

headers = {
    'cookie': '',
    'referer': 'https://www.taobao.com/',
    'user-agent': ''
}

url = "https://s.taobao.com/search?q=%E6%89%8B%E6%9C%BA&imgfile=&commend=all&ssid=s5-e&search_type=item&sourceId=tb.index&spm=a21bo.2017.201856-taobao-item.1&ie=utf8&initiative_id=tbindexz_20170306"
r = requests.get(url, headers=headers)
soup = BeautifulSoup(r.content, 'lxml')
# soup = BeautifulSoup(r.text, 'html.parser')
src = soup.select('head script')[0].string
# print('---------')
# print(src)
src_element = js2xml.parse(src, encoding='utf-8', debug=False)
# print('---------')
# print(src_element)
src_tree = js2xml.pretty_print(src_element)
print('---------')
print(src_tree)
print('---------')
number = src_element.xpath("//program/var[@name='g_config']/object/property[@name='appId']/number/@value")
print(number[0])

相关文章

  • 使用js2xml获取javascript中的变量

    有时候爬数据遇到像下面这种,数据在script标签中以javascript形式存在。 一般我们都是通过正则的方式抽...

  • JavaScript(一)

    Javascript 输出 引入外部文件 更改html中的内容 获取其值 声明变量使用var 声明函数functi...

  • javascript基础

    javascript: 变量的使用、数据类型、if判断、循环语句 javascript 中的注释: //...

  • JavaScript 变量提升

    JavaScript 中,函数及变量的声明都将被提升到函数的最顶部。JavaScript 中,变量可以在使用后声明...

  • JavaScript 变量提升

    JavaScript 中,函数及变量的声明都将被提升到函数的最顶部。JavaScript 中,变量可以在使用后声明...

  • 六、javascript变量、数据类型及数据类型转换

    1.变量 变量用于存储数据值,在JavaScript中,使用关键字var来定义变量,使用等号来为变量赋值 定义变量...

  • 三、JS变量

    JavaScript中的变量 变量的概述白话:变量就是一个装东西的盒子通俗:存放数据的容器,我们通过变量名获取数据...

  • JS获得url变量值

    javaScript 客户端中获取url的传参数 GetQueryString(name) name 为参数的变量...

  • 【JavaScript】变量提升以及var对变量提升的影响

    JavaScript中变量的提升,往往会影响到我们对变量的正常获取,所以特写此文,以便以后翻阅。 什么是变量提升 ...

  • 7 js 变量

    13 局部 JavaScript 变量在 JavaScript 函数内部声明的变量(使用 var)是局部变量,所以...

网友评论

      本文标题:使用js2xml获取javascript中的变量

      本文链接:https://www.haomeiwen.com/subject/btaxactx.html