【问题标题】:Python HTMl Scrape Not Yielding A ResultPython HTMl Scrape没有产生结果
【发布时间】:2017-03-19 17:24:56
【问题描述】:

(Python 新手和第一篇文章)

请参阅下面的代码,但问题是: 我正在尝试在代码中抓取页面上所有职位名称的网页,但是当我打印列表时,我没有得到任何值。我尝试使用不同的 xpath 来查看是否可以打印一些东西,但每次我的列表总是空的。

有谁知道这是我的代码有问题,还是我没有考虑到网站结构的问题?

提前致谢!

from lxml import html
import requests

page = requests.get("https://careers.homedepot.com/job-search-results/?location=Atlanta%2C%20GA%2C%20United%20States&latitude=33.7489954&longitude=-84.3879824&radius=15&parent_category=Corporate%2FOther")
tree = html.fromstring(page.content)

Job_Title = tree.xpath('//*[@id="widget-jobsearch-results-list"]/div/div/div/div[@class="jobTitle"]/a/text()')

print (Job_Title)

【问题讨论】:

  • 忘记跟进这一点,但我想我会指出 Selenium 做到了。有关更多信息,请参见下文。

标签: python python-3.x xpath web-scraping lxml


【解决方案1】:

您要查找的信息是使用一些JavaScript 动态生成的,而requests 允许获取初始HTML 页面源。

您可能需要使用selenium(+chromedriver) 来获取所需的数据:

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

driver = webdriver.Chrome()
driver.get("https://careers.homedepot.com/job-search-results/?location=Atlanta%2C%20GA%2C%20United%20States&latitude=33.7489954&longitude=-84.3879824&radius=15&parent_category=Corporate%2FOther")
xpath = "//a[starts-with(@id, 'job-results')]"
wait(driver, 10).until(EC.element_to_be_clickable((By.XPATH, xpath)))
jobs = [job.text for job in driver.find_elements_by_xpath(xpath)]

【讨论】:

  • 其他一些帖子提到那里有一些 JS。有没有一种好方法来判断它的 JS 是否没有当前的 JS 知识?感谢您的评论,有机会我会尝试其中的一些想法。
  • 您只需在浏览器中右键单击页面,然后在上下文菜单中单击Page source 即可在浏览器执行任何JavaScript 之前查看页面源。如果没有需要的数据,那么可以确定是JavaScript动态生成的数据
  • 刚刚运行了这个。对于我正在做的事情来说,这似乎是朝着正确方向迈出的一步。谢谢!现在只需要更熟悉 Selenium 哈哈
【解决方案2】:

尝试一个可以解析 JS 的库(dryscrape 是一个轻量级的替代方案)。

这是一个代码示例

from lxml import html
import requests
import dryscrape

session = dryscrape.Session()
session.visit("https://careers.homedepot.com/job-search-results/?location=Atlanta%2C%20GA%2C%20United%20States&latitude=33.7489954&longitude=-84.3879824&radius=15&parent_category=Corporate%2FOther")
page = session.body()
tree = html.fromstring(page.content)

Job_Title = tree.xpath('//*[@id="widget-jobsearch-results-list"]/div/div/div/div[@class="jobTitle"]/a/text()')

print (Job_Title)

【讨论】:

  • 谢谢,有机会我会试试的。你怎么能说它的JS? (还没有学到任何东西)如果 HTML、CSS 和一些 Python [我认为] 对我来说,一切看起来都像是混合体。
  • 我最终选择了 Andersson 发布的 Selenium 解决方案。根据我阅读的内容,我认为dryscrape 会运行良好,但它似乎不支持 Win(这是我使用的)。
【解决方案3】:

该页面使用 JS 构建 HTML(表格)。换句话说,目标块在该页面上不作为 HTML 存在。请打开源代码并检查它。

<div class="entry-content-wrapper clearfix">
    <div id="widget-jobsearch-results-list"></div> # <- Target block is empty!
    <div id="widget-jobsearch-results-pages"></div>
</div>

【讨论】:

    猜你喜欢
    • 2012-10-21
    • 1970-01-01
    • 1970-01-01
    • 2015-04-20
    • 2015-06-23
    • 2019-08-03
    • 1970-01-01
    • 2020-08-18
    • 1970-01-01
    相关资源
    最近更新 更多