【问题标题】:Web scraping with BeautifulSoup returns NoneType使用 BeautifulSoup 进行 Web 抓取返回 NoneType
【发布时间】:2019-01-18 17:08:57
【问题描述】:

我正在尝试使用 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,即使该 div 在网站上存在且具有正确的 ID。是不是我做错了什么?

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

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

【问题讨论】:

  • 尝试打印变量soup 并在其中搜索您想要的div...可能您找不到它。如果是这种情况,那是因为页面的内容是动态生成的...尝试使用selenium
  • 如果我打印 soup 我可以看到带有 main 的 div。
  • 我自己试过了...我找不到<div id="main"...请再试一次!!
  • @Anwarvic 在 chrome 中打开 devtools,使用 xpath 搜索工具,//div[@id="main"]
  • 对于亲密的选民,我将复制 OPs 问题。 @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 不同

【讨论】:

    猜你喜欢
    • 2022-12-17
    • 2021-10-27
    • 1970-01-01
    • 1970-01-01
    • 2021-11-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-09
    相关资源
    最近更新 更多