【问题标题】:Web scraping with BeautifulSoup returns NoneType使用 BeautifulSoup 进行网页抓取返回 NoneType
【发布时间】:2022-12-17 22:02:25
【问题描述】:

我正在尝试使用 BeautifulSoup 抓取一个网站并编写了以下代码:

import requests
from bs4 import BeautifulSoup

page = requests.get("https://gematsu.com/tag/media-create-sales")
soup = BeautifulSoup(page.text, 'html.parser')

try:
    content = soup.find('div', id='main')
    print (content)
except:
    print ("Exception")

但是,这会返回 NoneType,即使网站上存在具有正确 ID 的 div。我做错了什么吗?

我在页面上看到了带有 id main 的 div:

当我打印soup时,我也找到了div main:

【问题讨论】:

  • 尝试打印变量 soup 并在其中搜索您想要的 div ... 可能找不到。如果是这样,那是因为页面的内容是动态生成的...尝试使用selenium
  • 如果我打印soup,我可以看到带有 main 的 div。
  • 我自己试过了...找不到<div id="main"...请再试一次!!
  • @Anwarvic 在chrome中打开devtools,使用xpath搜索工具,//div[@id="main"]
  • 对于亲密的选民,我即将复制 OP 问题。 @Fang html.parser 似乎正在剥离该标签的 id 属性。将 html.parser 更改为 lxmlhtml5lib 对我有用

标签: python beautifulsoup


【解决方案1】:

BeautifulSoup's documentation 中简要介绍了这一点

Beautiful Soup 向许多不同的解析器提供相同的接口,但每个解析器都是不同的。不同的解析器将从同一文档创建不同的解析树。最大的区别在于 HTML 解析器和 XML 解析器之间

[ ... ]

这是使用 Python 的内置 HTML 解析器解析的同一文档:

BeautifulSoup("<a></p>", "html.parser")

与 html5lib 一样,此解析器忽略结束 </p> 标记。与 html5lib 不同,此解析器不会尝试通过添加标签来创建格式良好的 HTML 文档。与 lxml 不同,它甚至懒得添加标签。

您遇到的问题可能是由于html.parser 无法正确处理的格式错误的 HTML。当 BeautifulSoup 解析 HTML 时,这导致 id="main" 被剥离。通过将解析器更改为 html5liblxml,BeautifulSoup 处理格式错误的 HTML 的方式不同于 html.parser

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-11-15
    • 2018-08-02
    • 1970-01-01
    • 1970-01-01
    • 2020-10-04
    • 2021-01-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多