我可以清楚地看到我要获取要抓取的数据所需的标签。
根据多个教程,我做的方式完全相同。
所以当我只想在li
类之间显示代码时,为什么它给我“无”的消息
from bs4 import BeautifulSoup
import requests
response = requests.get("https://www.governmentjobs.com/careers/sdcounty")
soup = BeautifulSoup(response.text,'html.parser')
job = soup.find('li', attrs = {'class':'list-item'})
print(job)
答案 0 :(得分:2)
尽管页面确实会动态更新(它会从浏览器发出其他请求来更新您用单个请求无法捕获的内容),但是您可以在网络标签中找到感兴趣内容的源URI。您还需要添加预期的标题。
import requests
from bs4 import BeautifulSoup as bs
headers = {'X-Requested-With': 'XMLHttpRequest'}
r = requests.get('https://www.governmentjobs.com/careers/home/index?agency=sdcounty&sort=PositionTitle&isDescendingSort=false&_=', headers=headers)
soup = bs(r.content, 'lxml')
print(len(soup.select('.list-item')))
答案 1 :(得分:1)
原始页面中没有此类内容。您引用的搜索结果是使用JavaScript动态/异步加载的。
打印变量response.text
进行验证。我使用ReqBin得到了结果。您会发现里面没有文本list-item
。
答案 2 :(得分:1)
处理动态加载数据的另一种方法是使用硒,而不是获取页面源的请求。这应该等待Javascript正确加载数据,然后提供相应的html。可以这样做:
from bs4 import BeautifulSoup
from selenium.webdriver import Chrome
from selenium.webdriver.chrome.options import Options
url = "<URL>"
chrome_options = Options()
chrome_options.add_argument("--headless") # Opens the browser up in background
with Chrome(options=chrome_options) as browser:
browser.get(url)
html = browser.page_source
soup = BeautifulSoup(html, 'html.parser')
job = soup.find('li', attrs = {'class':'list-item'})
print(job)