用 Beautiful Soup、urllib2 和 Python 抓取一个 PHP 变量

Scrape a PHP variable with Beautiful Soup, urllib2, and Python

我正在尝试使用 Beautiful Soup 和 Python 从网站上抓取 PHP 值。

我也尝试过使用 lxml 库。

有这样的方法吗?或者我应该使用不同的东西吗?提前致谢。

遵循的步骤

  1. 查找所需的嵌套 HTML 标签。在本例中为“320”
  2. 解析 HTML 页。
  3. 搜索第一个 "div" 标签。
  4. 尝试搜索 "div" 标签的所有子标签。
  5. 将整个 HTML 页面输出到文本文件。
  6. Grep 所需的 "span" 标签名称。
  7. 请注意,该值是一个 PHP 变量。

xPath:

//*[@id="monetary_offer_content"]/div[1]/div[2]/div/div[1]/h3/span

CSS 选择器

monetary_offer_content > div.monetary_offer > div.offers.clear > div > div.clearfix > h3 > span

HTML:

<span data-oldoffer="">320</span>

将整个HTML页面输出到一个.txt文件然后grep元素名后:

| => cat text.txt | grep data-oldoffer
      <h3>$<span data-oldoffer><%= value['offer'] %></span></h3>
      <h3>$<span data-oldoffer><%= value['offer'] %></span></h3>

Python代码

from bs4 import BeautifulSoup
import urllib2
url="http://website_url.com"
page=urllib2.urlopen(url)
soup = BeautifulSoup(page.read(), "lxml")
print(soup)

看起来该值是通过 javascript 在浏览器中动态设置的。您使用 urllib2 下载的页面源仅包含初始 HTML。

您可以通过 selenium 启动并控制一个真正的浏览器,示例:

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.select import Select
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

url = "http://website_url.com"

driver = webdriver.Firefox()
wait = WebDriverWait(driver, 10)
driver.get(url)

elm = wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, "#monetary_offer_content > div.monetary_offer > div.offers.clear > div > div.clearfix > h3 > span")))
print(elm.text)

driver.close()