【问题标题】:BeautifulSoup: finding elements within elementsBeautifulSoup:在元素中查找元素
【发布时间】:2017-03-08 21:54:13
【问题描述】:

我正在尝试从以下网站的“a”类别下查找游戏列表。无论我尝试什么模式,我都可以直接在其中找到 id 属性值为“letter-a”的div,但找不到li 元素。

import bs4
import logging
import requests

logging.basicConfig(level=logging.DEBUG, format="%(asctime)s - \
%(levelname)s - %(message)s")

##res = requests.get("http://www.xbox.com/en-GB/xbox-one/backward-\
##compatibility")
res = requests.get("http://www.xbox.com/en-US/xbox-one/backward-\
compatibility/available-games")
res.raise_for_status()

soup = bs4.BeautifulSoup(res.text, "html.parser")
#game_elems = soup.select("body[id=\"DocumentBody\"] div[id=\"bodycolumn\"]")
game_elems = soup.select("#letter-a li")

logging.info("Length added elements: {}".format(len(game_elems)))
if game_elems:
    logging.info("First element in 'game_elems': {}".format(str(game_elems[0])))

【问题讨论】:

  • 你尝试过哪些模式?您尝试定位的 html 是什么样的?
  • Lots :) 添加了 html 的 img。
  • 你忘了详细描述什么不起作用,你得到了什么输出,你想要什么输出。

标签: python web web-scraping beautifulsoup


【解决方案1】:

您可以通过使用 Selenium 控制浏览器来抓取由 JS 修改的 DOM。要使用 Selenium 执行此操作,您可以这样做:

from selenium import webdriver
from selenium.webdriver.common.keys import Keys

driver = webdriver.Firefox()
driver.get("http://www.xbox.com/en-US/xbox-one/backward-compatibility/available-games")

elem = driver.find_element_by_css_selector("#letter-a")
print elem.get_attribute('innerHTML')
driver.close()

您还可以使用 Selenium 控制其他浏览器,包括 PhantomJS 等无头浏览器(在后台运行的浏览器,无需打开窗口)。


之前我注意到 HTML 格式不正确 - 您不应该在 ul 中直接包含 div。但这最终不是阻塞问题。

【讨论】:

  • 谢谢。我将研究如何使用其他解析器。
  • 我在回答中添加了一些示例。
  • 非常感谢伊万!非常感谢。
  • 嗯。我在安装 lxml 时遇到问题,我正在解决这个问题,但 html5lib 解析器也找不到我的 li 元素。在您给出的示例中更重要的是, html.parser 找到包含“aaa”的 li 元素:/
猜你喜欢
  • 1970-01-01
  • 2021-12-27
  • 2018-07-09
  • 2018-12-25
  • 1970-01-01
  • 2023-04-10
  • 2021-10-24
  • 1970-01-01
  • 2017-12-03
相关资源
最近更新 更多