【问题标题】:How To Extract Data Within a Javascript Tag Using Python's BeautifulSoup如何使用 Python 的 BeautifulSoup 在 Javascript 标签中提取数据
【发布时间】:2022-01-25 04:42:56
【问题描述】:

我正在尝试提取进行“系列:”的数据,如下所示。

 }
        },
        series: [{ name: '', showInLegend: false, animation: false, color: '#c84329', lineWidth: 2, data: [[1640926800000,164243],[1638248400000,224192],[1635566400000,143606],[1632974400000,208461],[1630382400000,85036],[1627704000000,25604],[1625025600000,44012],[1622433600000,111099],[1619755200000,53928],[1617163200000,12286],[1614488400000,12622],[1612069200000,4519],[1609390800000,12665],[1606712400000,314],[1604116800000,3032],[1601438400000,4164],[1598846400000,3302],[1596168000000,22133],[1593489600000,8098],[1590897600000,-1385],[1588219200000,43165],[1585627200000,427],[1582952400000,175],[1580446800000,174],[1577768400000,116],[1575090000000,196],[1572494400000,215],[1569816000000,418],[1567224000000,375],[1564545600000,375],[1561867200000,179],[1559275200000,132],[1556596800000,146],[1554004800000,163],[1551330000000,3],[1548910800000,49],[1546232400000,-29],[1543381200000,108],[1540958400000,35],[1538280000000,159],[1535688000000,287],[1533009600000,1152],[1530331200000,1306]] }],
        navigation: { menuItemStyle: { fontSize: '9px' } }
    });      

更具体地说,我正在尝试提取 data,它有一个 unix 时间戳和整数列表。这就是我目前所拥有的......

url = "https://socialblade.com/twitter/user/twitter"
headers = {'User-Agent': 'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:80.0) Gecko/20100101 Firefox/80.0'}
req = urllib.request.Request(url, headers=headers)
response = urllib.request.urlopen(req)
soup = bs(response.read(), 'html.parser')

soup = soup.find_all('script', {"type": "text/javascript"})
script = soup[6].text

有什么想法吗?

【问题讨论】:

    标签: python web-scraping beautifulsoup


    【解决方案1】:

    脚本的数据类型是字符串,所以我们可以使用“re”模块查找脚本中所有出现的“data”,然后我们可以观察到脚本中的每个数据都以“}”结尾,所以我们可以现在使用“data”子字符串的开头索引和数据后第一个“}”的索引找出数据之后的第一个“}”,我们可以使用字符串切片来找出数据。你可以看到下面给出的代码和输出。

    import re
    sub = "data"
    res = re.finditer(sub, script)
    for i in res:
      k = script.find("}",i.start())
      print(script[i.start():k])
    

    输出是:

    【讨论】:

      【解决方案2】:

      您所需数据的完整脚本

      import requests
      from bs4 import BeautifulSoup
      
      url = "https://socialblade.com/twitter/user/twitter"
      
      s = requests.Session()
      
      r = requests.get(
          url,
          headers={
              "User-Agent": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.71 Safari/537.36",
          },
      )
      
      soup = BeautifulSoup(r.text, "html.parser")
      req = soup.find_all("script", {"type": "text/javascript"})
      script = req[6].contents[0]
      data = script[2447: 3873]
      
      print(data)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-06-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-12-05
        • 2018-12-12
        相关资源
        最近更新 更多