Python 从网页中再刮取1个字段

Python 从网页中再刮取1个字段,python,selenium,web-scraping,beautifulsoup,Python,Selenium,Web Scraping,Beautifulsoup,我的代码进入一个网页,并从每一行获取某些数据 然而,我也想从每一行中获取“主题”。例如,在“发言人”文本上方的第1行中,列为“总统会议和社区精神病学” 我的代码目前能够抓取每行的标题和椅子(表示为角色和名称),但不能抓取主题 from selenium import webdriver import time from bs4 import BeautifulSoup driver = webdriver.Chrome() import pandas as pd driver = webdri

我的代码进入一个网页,并从每一行获取某些数据

然而,我也想从每一行中获取“主题”。例如,在“发言人”文本上方的第1行中,列为“总统会议和社区精神病学”

我的代码目前能够抓取每行的标题和椅子(表示为角色和名称),但不能抓取主题

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

driver = webdriver.Chrome()
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')

tables = soup.select('#datatable')
for table in tables:
    for title in table.select('tr td.title'):
        print(title.text.strip())
        title_row = title.parent
        speaker_row = title_row.next_sibling
        for speaker in speaker_row.select('span.session-speaker'):
            role = speaker.select_one('span.session-speaker-role').text.strip()
            name = speaker.select_one('span.session-speaker-name').text.strip()
            topic=speaker.select_one('span.session-track-label').text.strip() 
            print(role, name,topic)

        print()
如果希望所有主题都位于名称和角色之前,则必须从行中而不是从以下同级中定位它们


如果您希望所有主题位于名称和角色之前,则必须将它们定位在行中,而不是以下同级主题。

我认为此行仅包含“角色”和“名称”

它表示“span.session speaker”仅包含“span.session speaker role”和“span.session speaker name”

for speaker in speaker_row.select('span.session-speaker'):
您可以尝试下面的代码

L_topics=[]
for speaker in speaker_row.select('td.session-divider-line') :
    role = speaker.select_one('span.session-speaker-role').text.strip()
    name = speaker.select_one('span.session-speaker-name').text.strip()
    for topics in speaker_row.select('span.session-track-label'):
        L_topics.append(topics.text.strip())
    print(role,name,L_topics[0],L_topics[1])

我认为这一行只包含“角色”和“名称”

它表示“span.session speaker”仅包含“span.session speaker role”和“span.session speaker name”

for speaker in speaker_row.select('span.session-speaker'):
您可以尝试下面的代码

L_topics=[]
for speaker in speaker_row.select('td.session-divider-line') :
    role = speaker.select_one('span.session-speaker-role').text.strip()
    name = speaker.select_one('span.session-speaker-name').text.strip()
    for topics in speaker_row.select('span.session-track-label'):
        L_topics.append(topics.text.strip())
    print(role,name,L_topics[0],L_topics[1])

您对每一行的tr都做得太深了,并且没有超出会话演讲者的范围。span.session-speaker是包含您所寻求元素的tds的以下兄弟。您对每一行的tr都做得太深了,并且没有脱离会话演讲者。span.session-speaker是tds的以下兄弟,它包含您所寻求的元素。