有时候爬数据遇到像下面这种,数据在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