使用beautifulsoup解析HTML,结果为“无”

时间:2019-11-09 22:08:30

标签: python web-scraping beautifulsoup

我可以清楚地看到我要获取要抓取的数据所需的标签。

根据多个教程,我做的方式完全相同。

所以当我只想在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)

enter image description here

3 个答案:

答案 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

很遗憾,您can't run JavaScript with BeautifulSoup

答案 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)