Beautifulsoup刮数据中间有一个js文本

时间:2016-04-03 06:57:01

标签: javascript python-2.7 beautifulsoup

我试图从下面提供的页面中抓取大量数据,当我在浏览器上查看时,我看到了一条路径但是,当我使用BeautifulSoup时,我无法获取此信息数据。比如我在北京城市之后的路径,但我得到的是无。当我打印汤时,我可以看到html的格式非常不同(我相信js)并且beautifulsoup无法处理它,所以我能够从该部分提取数据的替代方案。感谢。

from bs4 import BeautifulSoup,Tag
import urllib2
hdr = {'Accept': 'text/html,application/xhtml+xml,*/*',"user-agent":"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/48.0.2564.116 Safari/537.36"}
url='https://www.upwork.com/freelancers/_~013dfabae39ba01678/'
req=urllib2.Request(url,headers=hdr)
html = urllib2.urlopen(req)
soup=BeautifulSoup(html,"lxml")
#when I inspect I see a path as follows, however printing the soup shows a txt/javascript..
locality=soup.find('span',{'itemprop':'locality'})

在beautifulsoup输出的中间,您可以找到var phpVars的所有感兴趣的数据:

<script type="text/javascript">
    // global Applet object
    var Applet = new function() {
        var basePath = '/freelancers';
        var phpVars = {"urchinId":"UA-62227314-1","csrfTokenCookieName":"XSRF-TOKEN","csrfTokenHeaderName":"X-Odesk-Csrf-Token","runtime_id":"0128305700c7dc55bb8","clientStatsDMetrics":true,"smfAjax":false,"userId":"424358860525125632","isVisitor":true,

1 个答案:

答案 0 :(得分:0)

你可以试试这个:

from bs4 import BeautifulSoup
import urllib2
import re
import json

hdr = {'Accept': 'text/html,application/xhtml+xml,*/*',"user-agent":"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/48.0.2564.116 Safari/537.36"}
url='https://www.upwork.com/freelancers/_~013dfabae39ba01678/'
req=urllib2.Request(url,headers=hdr)
html = urllib2.urlopen(req)
soup=BeautifulSoup(html,"lxml")

script = soup.title.find_next('script').get_text()
map_search = re.search('.*var phpVars = (\{.*);', script)
mapData = map_search.group(1)
mapDataObj = json.loads(mapData)

print mapDataObj['profile']['profile']['location']['city']

script之后首先搜索title并提取内容。

您感兴趣的数据是json格式,我们必须使用正则表达式从此脚本中提取json部分,并使用python json模块解析它。

您最终可以通过名为mapDataObj的字典访问数据。