如何使用Python检索动态html内容的值

时间:2013-07-11 15:24:20

标签: python html templates urllib

我正在使用Python 3而我正在尝试从网站检索数据。但是,这些数据是动态加载的,我现在的代码不起作用:

url = eveCentralBaseURL + str(mineral)
print("URL : %s" % url);

response = request.urlopen(url)
data = str(response.read(10000))

data = data.replace("\\n", "\n")
print(data)

在我试图找到特定值时,我找到了一个模板,例如“{{formatPrice median}}”而不是“4.48”。

如何制作它以便我可以检索值而不是占位符文本?

编辑:This是我正在尝试从中提取信息的特定页面。我正在尝试获取“中位数”值,该值使用模板{{formatPrice median}}

编辑2:我已经安装并设置了我的程序以使用Selenium和BeautifulSoup。

我现在的代码是:

from bs4 import BeautifulSoup
from selenium import webdriver

#...

driver = webdriver.Firefox()
driver.get(url)

html = driver.page_source
soup = BeautifulSoup(html)

print "Finding..."

for tag in soup.find_all('formatPrice median'):
    print tag.text

Here是程序正在执行的屏幕截图。不幸的是,它似乎没有找到任何指定“formatPrice median”的内容。

4 个答案:

答案 0 :(得分:14)

假设您正在尝试从使用javascript模板呈现的页面中获取值(例如handlebars之类的内容),那么这就是您将使用任何标准解决方案获得的内容(即{{1} }或beautifulsoup)。

这是因为浏览器使用javascript来改变收到的内容并创建新的DOM元素。 requests将像浏览器一样执行请求部分,但不会执行模板呈现部分。 A good description of the issues can be found here。本文讨论了三个主要解决方案:

  1. 直接解析ajax JSON
  2. 使用离线Javascript解释程序处理请求SpiderMonkeycrowbar
  3. 使用浏览器自动化工具splinter
  4. This answer为选项3提供了一些建议,例如selenium或watir。我已经使用selenium进行自动化网络测试,非常方便。


    修改

    从您的评论中看起来它是一个由车把驱动的网站。我推荐硒和美味的汤。 This answer提供了一个很有用的代码示例:

    urllib

    基本上selenium从浏览器中获取呈现的HTML,然后您可以使用from bs4 import BeautifulSoup from selenium import webdriver driver = webdriver.Firefox() driver.get('http://eve-central.com/home/quicklook.html?typeid=34') html = driver.page_source soup = BeautifulSoup(html) # check out the docs for the kinds of things you can do with 'find_all' # this (untested) snippet should find tags with a specific class ID # see: http://www.crummy.com/software/BeautifulSoup/bs4/doc/#searching-by-css-class for tag in soup.find_all("a", class_="my_class"): print tag.text 属性中的BeautifulSoup来解析它。祝你好运:)

答案 1 :(得分:1)

我用了硒+铬

 `from selenium import webdriver
 from selenium.webdriver.chrome.options import Options

 url = "www.sitetotarget.com"
 options = Options()
 options.add_argument('--headless')
 options.add_argument('--disable-gpu')
 options.add_argument('--no-sandbox')
 options.add_argument('--disable-dev-shm-usage')`

答案 2 :(得分:0)

构建另一个答案,但更完整。

from selenium import webdriver
from selenium.webdriver.chrome.options import Options
options = Options()
options.add_argument('--headless') #background task; don't open a window
options.add_argument('--disable-gpu')
options.add_argument('--no-sandbox')#I copied this, so IDK?
options.add_argument('--disable-dev-shm-usage')#this too
driver.get(url)# set browser to use this page
time.sleep(6) # let the scripts load
html = driver.page_source #copy from chrome process to your python instance
driver.quit()

mac + chrome的安装:

pip install selenium
brew cask install chromedriver
brew cask install google-chrome

答案 3 :(得分:0)

我知道这是一个老问题,但有时有比使用重硒更好的解决方案。

python 的这个 request module 带有 JS 支持(在后台它仍然是铬),你仍然可以像平常一样使用 beautifulsoup。 不过,有时如果您必须单击元素或某物,我想硒是唯一的选择。