Web使用Bs4和Selenium抓取没有类的p标签

时间:2019-12-28 21:12:25

标签: python html selenium web-scraping beautifulsoup

我正在尝试将此网页抓取->

enter image description here

HTML具有带有类的div标签。在这个div标签中,还有另一个div标签,还有另一个p标签,没有类。我的目标是专门获取没有类的孤独p标签,并从中获取文本数据。

到目前为止,这是我的代码->

我未在代码中包含某些导入内容和其他部分。

html = driver.page_source
time.sleep(.1)
soup = bs.BeautifulSoup(html, 'lxml')
time.sleep(.1)


Class_Details = soup.find_all("div", {"class":"row-fluid data_row primary-row class-info class-not-checked"})

for class_detail in Class_Details:
Class_status = class_detail.find_all("div", {"class":"statusColumn"}) 
Status = Class_status[0].text

class_date = class_detail.find_all("p",{"class":"hide-above-small beforeCollapseShow"})
class_time = class_date[0].text 

The 4 lines above can be ignored they work and accomplish their tasks, the lines below however do not and is what I am asking.

cla = class_detail.find_all("p",{"class":"timeColumn"})
print(cla)

The Output of print(cla) is 
[]
[]
[]
[]
[]
[]
[]

好处是,有7个空列表与网站一致,因此它肯定是在计数/检测到我要抓取的零件,但是我需要将输出作为文本。

我希望我的问题很清楚,谢谢您的宝贵时间。

3 个答案:

答案 0 :(得分:2)

不打印输出的原因是因为您尝试打印元素,而不是元素文本。您应该将代码更改为以下内容:

cla = class_detail.find_all("p",{"class":"timeColumn"})
for item in cla:
    print(item.text)

我知道您正在使用BeautifulSoup,但是如果您找不到自己喜欢的BS实现,我还将提供使用Selenium / XPath的解决方案:

elements_list = driver.find_elements_by_xpath("//div[@class='timeColumn'/p]")

for element in elements_list:
    print(element.text)

答案 1 :(得分:1)

要获取不带类的 p 标签,请使用.timeColumn p:not([class])选择器:

# select_one to get first one
p_no_class = class_detail.select_one(".timeColumn p:not([class])").text
print(p_no_class)

# select to get all
all_p_no_class = class_detail.select(".timeColumn p:not([class])")
for p in all_p_no_class:
    print(p.text)

答案 2 :(得分:0)

所需元素是启用了JavaScript的元素,因此要提取文本 7:45 am-10:50am ,您需要为其诱导 WebDriverWait visibility_of_element_located(),则可以使用以下Locator Strategies中的任何一个:

  • 使用XPATH

    print(WebDriverWait(driver, 30).until(EC.visibility_of_element_located((By.CSS_SELECTOR, "//div[@class='timeColumn']/div[contains(@id, 'days_data')]/p/a[@class='popover-bottom' and text()='F']//following::p[1]"))).text)
    
  • 注意:您必须添加以下导入:

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