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


<script type="text/javascript">
    var totalReviewsValue = 32;
    var averageRating = 4.5;
    if(totalReviewsValue != 0){
        events = "...";
    }
</script>

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

先提前出js文本


from pyquery import PyQuery as pq
doc = pq(html)js_text = doc('script').text()

print(js_text)
var totalReviewsValue = 32;
    var averageRating = 4.5;
    if(totalReviewsValue != 0){        events = "...";
    }
		

js2xml


import js2xml

doc = pq(html)

js_text = doc('script').text()

parse_js = js2xml.parse(js_text)

print(type(parse_js))
print(parse_js)
<class 'lxml.etree._Element'>
<Element program at 0x10f136888>

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


js2xml.pretty_print(data)

wow,返回我们熟悉的标记语言字符串。


<program>
  <var name="totalReviewsValue">
    <number value="32"/>
  </var>
  <var name="averageRating">
    <number value="4.5"/>
  </var>
  <if>
    <predicate>
      <binaryoperation operation="!=">
        <left>
          <identifier name="totalReviewsValue"/>
        </left>
        <right>
          <number value="0"/>
        </right>
      </binaryoperation>
    </predicate>
    <then>
      <block>
        <assign operator="=">
          <left>
            <identifier name="events"/>
          </left>
          <right>
            <string>...</string>
          </right>
        </assign>
      </block>
    </then>
  </if>
</program>

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

我们想获取name=averageRating节点里的number节点中的value属性的值。


number = parse_js.xpath("//program/var[@name='averageRating']/number/@value")

print(number)print(number[0])
['4.5']
4.5