我正在尝试从此URL中爬取所有表格的标题:https://www.nature.com/articles/s41586-023-06192-4
我可以在网站上找到这个HTML元素:
<b id="Tab1" data-test="table-caption">Table 1 Calculated Ct–M–Ct angles</b>
我无法爬取这个标题,因为找不到它。 即使我将HTML脚本打印到控制台,也找不到这个元素。
我使用以下代码打印HTML脚本:
from requests_html import HTMLSession from bs4 import BeautifulSoup url = 'https://www.nature.com/articles/s41586-023-06192-4' session = HTMLSession() response = session.get(url) response.html.render() soup = BeautifulSoup(response.html.raw_html.decode('utf-8'), 'html.parser') print(soup.prettify())
使用BeautifulSoup的爬取函数:
def get_tables(driver): tables = [] html = driver.page_source soup = BeautifulSoup(html, 'html.parser') for i in range(1, 11): try: table_caption = soup.find('b', {'id': f'Tab{i}', 'data-test': 'table-caption'}) table_text = table_caption.text if table_caption else "Not Available" if table_text != "Not Available": print(f"找到表格{i}:{table_text}") else: print(f"未找到表格{i}。") tables.append(table_text) except Exception as e: print(f"处理表格{i}时出错:{str(e)}") tables.append("Not Available") return tables
使用Selenium的爬取函数:
def get_tables(driver): tables = [] for i in range(1, 11): try: table_caption = driver.find_element_by_css_selector(f'b#Tab{i}[data-test="table-caption"]') table_text = table_caption.text if table_caption else "Not Available" if table_text != "Not Available": print(f"找到表格{i}:{table_text}") else: print(f"未找到表格{i}。") tables.append(table_text) except Exception as e: print(f"处理表格{i}时出错:{str(e)}") tables.append("Not Available") return tables
我尝试使用Selenium和BeautifulSoup来爬取网站。 我已经检查了iframe。 我延迟了提取操作40秒,以确保页面完全加载。 即使是GPT4也无法解决这个问题。
所以你使用的代码看起来没问题,我想到的问题是,网站可能是通过JavaScript或某个XHR调用加载你要爬取的那个元素,因此当你使用requests库发送请求时,它无法获取到那个元素。
解决这个问题的方法是,尝试使用Selenium,用selenium打开网站,然后将页面源代码加载到bs4中,这样你的代码就能正常工作了。
注意:当整个网站加载完毕后,将页面源代码加载到bs4中。你还需要使用selenium创建一个登录功能,因为这个网站需要登录才能查看内容。