【问题标题】:Text missing after scraping a website using BeautifulSoup使用 BeautifulSoup 抓取网站后文本丢失
【发布时间】:2018-10-19 06:01:11
【问题描述】:

我正在编写一个 python 脚本来获取特定用户在正在进行的 hactoberfest 活动期间生成的拉取请求的数量。 这是hacktoberfest官网的链接。
这是我的代码:

url= 'https://hacktoberfest.digitalocean.com/stats/user'
import urllib.request
from bs4 import BeautifulSoup
req = urllib.request.Request(url, headers={'User-Agent': 'Mozilla/5.0'})
html = urllib.request.urlopen(req).read()
soup = BeautifulSoup(html, 'html.parser')
name_box = soup.find('div', attrs={'class': 'userstats--progress'})
print(name_box)

代码第一行中的“用户”应替换为用户的 github 句柄(例如 BAJUKA)。

下面是我要抓取的 HTML 标签:

<div class="userstats--progress">
        <p>
          Progress (<span data-js="userPRCount">5</span>/5)
        </p>
          <div class="ProgressBar ProgressBar--three u-mb--regular ProgressBar--full" data-js="progressBar"></div>
      </div>

这是我运行代码后得到的:

<div class="userstats--progress">
<p>
          Progress (<span data-js="userPRCount"></span>/5)
        </p>
<div class="ProgressBar ProgressBar--three u-mb--regular" data-js="progressBar"></div>
</div>

区别在于第三行缺少拉取请求的数量(即在跨度标记中缺少 5)
这些是我想问的问题:
1.为什么没有。抓取的行中缺少拉取请求(在这种情况下为 5 个)?
2.我该如何解决这个问题?那就是得到否。拉取请求成功。

【问题讨论】:

  • 该数字可能是由userPRCount 脚本添加的,该脚本在标签的data-js= 属性中引用;如果未缩小/混淆,则可以从 json 文件或脚本本身中提取此信息。编辑:确认,如果您在关闭 JS 的情况下访问该页面,则不会显示数据
  • 好的,所以我可以在他们的页面加载的脚本中找到对 userPRCount 的唯一引用是在 hacktoberfest.digitalocean.com/assets/… 中,或者在访问页面时浏览器加载的任何内容。代码被缩小了。它调用o=document.querySelectorAll('[data-js="userPRCount"]'),这可能就是将数字添加到 html 页面的原因。逆向工程可能需要你一两天的时间。

标签: python web-scraping beautifulsoup html-parsing


【解决方案1】:

您要查找的数据不在 hacktober 服务器发送的原始数据中,Beautiful Soup 下载并解析;加载原始数据后,它由在浏览器中该页面上运行的 Javascript 代码插入到 HTML 中。

如果您使用此 shell 命令下载实际用作页面的数据,您会看到您正在查看的 span 标记一开始是空的:

curl -s 'https://hacktoberfest.digitalocean.com/stats/BAJUKA' | grep -3 Progress

填充该标签的 javascript 是什么?嗯,它被缩小了,所以很难解开正在发生的事情。您可以在原始数据的最底部找到它:

curl -s 'https://hacktoberfest.digitalocean.com/stats/BAJUKA' | grep -3 "script src=" | tail -n5

当我运行它时,输出如下:

<script src="https://go.digitalocean.com/js/forms2/js/forms2.min.js"></script>
<script src="/assets/application-134859a20456d7d32be9ea1bc32779e87cad0963355b5372df99a0cff784b7f0.js"></script>

那个看起来很疯狂的源 URL 是一段缩小的 Javascript,这意味着它已被自动缩小,这也意味着它几乎不可读。但是如果你去that page.,并且页面从右到底部,你会看到一些乱码的Javascript,你可以尝试解码。

我注意到了这一点:

var d="2018-09-30T10%3A00%3A00%2B00%3A00",f="2018-11-01T12%3A00%3A00%2B00%3A00";$.getJSON("https://api.github.com/search/issues?q=-label:invalid+created:"+d+".."+f+"+type:pr+is:public+author:"+t+"&per_page=300"

我认为这是获取数据以填充该 DIV 的地方。如果你加载并解析 that URL,我想你会找到你需要的数据。您需要填写该搜索的日期和作者。祝你好运!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-12-15
    • 2020-05-30
    • 2020-06-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多