使用 Beautifulsoup 解析时更改 HTML 中的标记

Changing tag in a HTML when parsed with Beautifulsoup

我正在尝试使用漂亮的汤来抓取 webpage,但我遇到了一个标签问题,该标签与我浏览器中显示的内容和我在终端中收到的内容发生了神秘的变化。

好的,上面的标签对应于我浏览器中上面的 HTML 标签。 一旦我用 beautiful 解析它,我就做了:

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"标签突然变成了"span"标签?我怎样才能避免它?

有一些问题,一些标签是使用 Javascript 创建的,实际上有两个标签有一个 title="Bandes-annonces",您在输出中看到的是第一次出现混淆数据,即 base-64 编码并嵌入子字符串,您可以在其中看到具有以下 AC.config = { 的 Js 函数:

 seo: {
        obfuscatedPrefix: 'ACr'
    },

您从请求返回的源中的每个标签都包含编码数据,例如 ACrL3ZACrpZGVvL3BsYXllcl9nZW5fY21lZGlhPTE5NTYxOTgyJmNmaWxtPTE0NDE4NS5odG1s

你可以看看我们是否替换了任何出现的前缀 ACrbase-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>

给你第二次出现标题为=..

的标签

然后获取 href:

In [122]: trailer["class"][0].replace("ACr", "").decode("base-64")
Out[122]: '/video/player_gen_cmedia=19561982&cfilm=144185.html'

您可以看到,从该站点抓取数据不会非常直接,混淆可能是有充分理由的,因为他们很可能不希望您这样做,因此使抓取更加困难它。