gpt4 book ai didi

Python BeautifulSoup : Text from the html (web) page not shown while soup. find_all(..)

转载 作者:行者123 更新时间:2023-11-28 22:37:02 27 4
gpt4 key购买 nike

我正在研究 IndiaBix.com 的数据抓取,我试图获取所有问题及其选项和答案。我成功地得到了问题和选项,但我无法得到答案。答案格式如下所示:

<div class="div-spacer">
<p><span class="ib-green"><b>Answer:</b></span> Option <b class="jq-hdnakqb">A</b></p>
<p><span class="ib-green"><b>Explanation:</b></span></p>
<p> No answer description available for this question. <b><a href="discussion-553">Let us discuss</a></b>. </p>
</div>

在代码中

<b class="jq-hdnakqb">A</b>

对于这一行,解析器没有获取文本“A”。

IndiaBix页面链接如下: Click here

在浏览器中,InspectElement 文本“A”是可见的,而该解析器并未获取 beautifulSoup 中的文本。

请帮我解决这个问题。我是 python 新手。

最佳答案

这是一项协作工作。我用了alecxe's BeautifulSoup gist获取并漂亮地打印问题,然后我进行了必要的去混淆处理以获得答案:

import requests
from bs4 import BeautifulSoup

url = "http://www.indiabix.com/computer-science/operating-systems-concepts/013001"
data = requests.get(url, headers={
"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.94 Safari/537.36"
}).content
soup = BeautifulSoup(data, "html.parser")

answers_string = soup.findAll("input", {"id":"hdnAjaxImageCacheKey"})[0]["value"]
answers = answers_string[::-1][17:22].upper()

# iterate over questions
for num, question_block in enumerate(soup.select(".bix-div-container")):
question = question_block.select(".bix-td-qtxt")[0].get_text(strip=True)
print(question + "\n")

# iterate over answers
for answer_block in question_block.select(".bix-tbl-options tr"):
number, answer = answer_block.select(".bix-td-option")

print(number.get_text(), answer.get_text())

print("\nANSWER: " + answers[num])
print("----")

该站点执行一些时髦的evaling(在this 脚本中找到)并从隐藏输入中的40 个字符的字符串中获取答案:

/* Load Images Indirectly For Better User Experience */
try{eval(function(p,a,c,k,e,d){e=function(c){return(c<a?'':e(parseInt(c/a)))+((c=c%a)>35?String.fromCharCode(c+29):c.toString(36))};while(c--){if(k[c]){p=p.replace(new RegExp('\\b'+e(c)+'\\b','g'),k[c])}}return p}('0 5=l.o.h.2(\'\').8().7(\'\').e("m"+"n"+"q");g(5>-1){0 d=$(\'4\'+\'#\'+\'3\'+\'p\'+\'k\'+\'f\'+\'j\').r().6(C).2(\'\').8().7(\'\').6(B).s().2(\'\');0 c=$(\'4\'+\'.\'+\'a\'+\'-\'+\'3\'+\'D\');0 9=$(\'b\'+\'.\'+\'a\'+\'-\'+\'3\'+\'A\'+\'z\');u.t(d,w(i,v){c[i].x=v;9[i].y=v})}',40,40,'var||split|hdn|input|intPos|substr|join|reverse|arrImageViews|jq||arrImagePorts|arrImageCount|indexOf|Cache|if|href||Key|Image|window|xi|baid|location|Ajax|ni|val|toUpperCase|each|jQuery||function|value|innerHTML|qb|ak|17|18|akq'.split('|')))}catch(err){}

请注意通过评论误导好奇访客的愚蠢尝试 :D

/* Load Images Indirectly For Better User Experience */

eval 被简化并缩小尺寸时,它看起来像这样:

var arrImageCount=$('input'+'#'+'hdn'+'Ajax'+'Image'+'Cache'+'Key').val().substr(18).split('').reverse().join('').substr(17).toUpperCase().split('');

var arrImagePorts=$('input'+'.'+'jq'+'-'+'hdn'+'akq');

var arrImageViews=$('b'+'.'+'jq'+'-'+'hdn'+'ak'+'qb');

jQuery.each(arrImageCount,function(i,v){arrImagePorts[i].value=v;arrImageViews[i].innerHTML=v})

提示:如果您害怕 eval 随机 JS(您应该是),请将 eval 替换为 print

无论如何,代码非常简单。它执行以下操作:

  • 从隐藏输入框获取字符串
  • 扭转它
  • 提取索引17到22的5个字符
  • 将它们拆分成一个数组
  • 使用 jQuery 将数组内容(即答案)添加到页面上的 5 个问题

这在 Python 中很容易模仿,如下所示:

answers_string = soup.findAll("input", {"id":"hdnAjaxImageCacheKey"})[0]["value"]
answers = answers_string[::-1][17:22].upper()

关于Python BeautifulSoup : Text from the html (web) page not shown while soup. find_all(..),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36981597/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com