【问题标题】:Scraping Webpage with Javascript Elements使用 Javascript 元素抓取网页
【发布时间】:2020-07-07 18:14:06
【问题描述】:

因此,作为我一直试图抓取的网站的序言,似乎有/使用(我不确定与 Web 开发等相关的行话)javascript 代码,并且我一直在尝试取得不同程度的成功在不同的页面上抓取不同的表格。

例如在此页面上:http://www.tennisabstract.com/cgi-bin/player.cgi?p=NovakDjokovic 我很容易能够“检查元素”然后转到 Network 找到脚本的正确“名称”,然后找到我需要的请求 URL 来获取我需要的表通缉。我用于此的代码是:

url = 'http://www.minorleaguesplits.com/tennisabstract/cgi-bin/frags/NovakDjokovic.js'
content = requests.get(url)
soup = BeautifulSoup(content.text, 'html.parser')

table = soup.find('table', id='tour-years', attrs= {'class':'tablesorter'})
dfs = pd.read_html(str(table)) 
df = pd.concat(dfs)

但是,现在当我查看同一站点上的不同页面时,例如http://www.tennisabstract.com/charting/20190714-M-Wimbledon-F-Roger_Federer-Novak_Djokovic.html,我无法找到可以让我最终获得所需表格的请求 URL。我重复与上面相同的过程,但在包含表格的网络选项卡下没有.js 脚本。当我查看 html 元素时,我确实看到了表格,但是如果没有正确的 url,我当然无法获得它。

所以我的问题是,我怎样才能从这个页面http://www.tennisabstract.com/charting/20190714-M-Wimbledon-F-Roger_Federer-Novak_Djokovic.html 获取表格?

TIA!

【问题讨论】:

    标签: python python-3.x web-scraping beautifulsoup python-requests


    【解决方案1】:

    查看 html 页面的源代码,您可以看到所有数据都已加载到 script 标签中。您唯一需要的就是提取变量值并将其加载到 beautifulsoup。

    以下代码给出了脚本标签中的所有变量和值

    import requests, re
    from bs4 import BeautifulSoup
    
    res = requests.get("http://www.tennisabstract.com/charting/20190714-M-Wimbledon-F-Roger_Federer-Novak_Djokovic.html")
    soup = BeautifulSoup(res.text, "lxml")
    script = soup.find("script", attrs={"language":"JavaScript"}).text
    
    var_only = script[:script.index("$(document)")].strip()
    

    接下来您可以使用正则表达式来获取变量值 - https://regex101.com/r/7cE85A/1

    【讨论】:

    • 感谢您的回复!就一件事;我在var_only = script[:script.index("$(document)")].strip() 这一行遇到错误。它说ValueError: substring not found。它应该是一个空字符串吗?
    • @dejsdukes 如果解决了您的问题,请接受答案
    • 哦,这真的很奇怪,当我执行print(script) 时得到一个空字符串,这应该发生吗?我不太熟悉var_only=... 行及其功能。不过还是谢谢你的回答
    • 好的,所以我通过 script = soup.find("script", attrs={"language":"JavaScript"}).string 而不是 script = soup.find("script", attrs={"language":"JavaScript"}).text 解决了我的空字符串问题
    • @dejsdukes 很高兴听到
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-27
    • 1970-01-01
    • 2017-03-07
    • 2021-09-25
    • 2017-06-22
    相关资源
    最近更新 更多