让这个刮擦更整洁?

时间:2021-04-07 14:57:13

标签: python selenium web-scraping beautifulsoup

我的代码抓取了一个网页。网页上的每行都标识了每个条目。

但是,我无法找到分隔每一行的内容。我抓取了所有标题(这很好用,因为每行只有 1 个唯一标题)

但是对于像“Chair”这样的字段,每行可以有多个,我的代码无法区分哪些数据来自哪一行。

例如 - 网页上的第 2 行 - 椅子上有多个人,我的代码不区分谁来自哪个行/标题。

有没有办法修改我的代码?

from selenium import webdriver
import time
from bs4 import BeautifulSoup
driver = webdriver.Chrome()
import pandas as pd

driver.get('https://s7.goeshow.com/apa/annual/2021/session_search.cfm?_ga=2.259773066.1015449088.1617295032-97934194.1617037074')
page_source = driver.page_source
soup=BeautifulSoup(page_source,'html.parser')

eachTitle=soup.find_all('span',class_='session-title')
for item in eachTitle:
    print(item.text.strip())
eachChair=soup.find_all('span',class_='session-speaker-name')
for j in eachChair:
    print(j.text.strip())

1 个答案:

答案 0 :(得分:0)

如果您不关心演示文稿的顺序,您可以使用 beautifulsoup 而无需浏览器的开销。 css 选择器的工作原理是,您可以通过具有类 heading 和紧邻行的子行来识别目标行。您可以更改选择器以保持顺序。

import requests
from bs4 import BeautifulSoup

page_source = requests.get('https://s7.goeshow.com/apa/annual/2021/session_search.cfm?_ga=2.259773066.1015449088.1617295032-97934194.1617037074').text
soup = BeautifulSoup(page_source, 'lxml')

for session in soup.select('tr:has(.heading), tr:has(.heading) + tr'):
    print(session.select_one('a strong').text.strip())  
    
    for speaker in session.select('.session-speaker'):
        role = speaker.select_one('.session-speaker-role').text.strip()
        name = speaker.select_one('.session-speaker-name').text.strip()
        print(role, name)
    
    print('labels: ', [i.text.strip() for i in session.select('.session-track-label')])
    print()