我正在尝试使用漂亮的汤来抓取webpage,但是我遇到了一个问题,这个标签神秘地改变了我浏览器中显示的内容以及我在终端中收到的内容。
好的,所以上面的标签对应我浏览器中的HTML标签。 一旦我用美丽的方式解析它,我就做了:
from bs4 import BeautifulSoup
import requests
url = "http://www.allocine.fr/film/fichefilm_gen_cfilm=144185.html"
page = requests.get(url)
soup = BeautifulSoup(page.content, 'html.parser')
trailer = soup.find(title="Bandes-annonces")
print trailer
哪个输出:
<span class="ACrL3ZACrpZGVvL3BsYXllcl9nZW5fY21lZGlhPTE5NTYxOTgyJmNmaWxtPTE0NDE4NS5odG1s item trailer icon icon-play-mini" title="Bandes-annonces">
Bandes-annonces
</span>
我想知道为什么我的“a”标签突然成为“跨度”标签?我怎么能避免它?
答案 0 :(得分:2)
有一些问题,一些标签是使用 Javascript 创建的,实际上有两个标签有 title =“Bandes-annonces”,你看到的是什么在您的输出中第一次出现模糊数据,其中 base-64 使用嵌入的子字符串进行编码,您可以在其中一个具有AC.config = {
以下的Js函数中看到:< / p>
seo: {
obfuscatedPrefix: 'ACr'
},
您从请求中获取的源中的每个标记都包含编码数据,例如 ACrL3ZACrpZGVvL3BsYXllcl9nZW5fY21lZGlhPTE5NTYxOTgyJmNmaWxtPTE0NDE4NS5odG1s
你可以看看我们是否替换任何出现的前缀 ACr 和 base-64 解码剩余的字符串:
In [113]: s = "ACrL3ZACrpZGVvL3BsYXllcl9nZW5fY21lZGlhPTE5NTYxOTgyJmNmaWxtPTE0NDE4NS5odG1s"
In [114]: s.replace("ACr", "").decode("base-64")
Out[114]: '/video/player_gen_cmedia=19561982&cfilm=144185.html'
我们得到了href。
如果您想获得带标题的标记,可以使用 css类之一:
trailer = soup.find(class_="icon-play-mini", title="Bandes-annonces")
如果我们运行代码:
In [117]: url = "http://www.allocine.fr/film/fichefilm_gen_cfilm=144185.html"
In [118]: page = requests.get(url)
In [119]: soup = BeautifulSoup(page.content, 'html.parser')
In [120]: trailer = soup.find(class_="icon-play-mini", title="Bandes-annonces")
In [121]: print trailer
<span class="ACrL3ZACrpZGVvL3BsYXllcl9nZW5fY21lZGlhPTE5NTYxOTgyJmNmaWxtPTE0NDE4NS5odG1s item trailer icon icon-play-mini" title="Bandes-annonces">
Bandes-annonces
</span>
使用title = ..
为您提供第二次出现的标记然后获得href:
In [122]: trailer["class"][0].replace("ACr", "").decode("base-64")
Out[122]: '/video/player_gen_cmedia=19561982&cfilm=144185.html'
你可以看到从该网站获取数据并不是非常直接,混淆可能是有充分理由的,因为他们很可能不希望你这样做而更难刮。