發現了一個使用Selenium的find_element
模塊,快速獲取文字和表格的方法,很實在,以后爬網的時候,就不用beautifulSoup 和 pandas的read_html 混起來用了!
文字部分:實現網絡節點下,某個節點下的其他子孫節點的文字的拼接
表格部分:實現獲取表格,并轉為列表格式
話不多說,碼上:
1. 獲取文字的部分
如果是簡單的文字,直接用text就完成了:
xpath_name='//div[@class="example"]'
driver.find_element(By.XPATH,xpath_name).text
但是有時候,有些文字就會分成很多個節點,要把這些文字拼起來就很麻煩,例如:
有時候在網絡節點里,一會是span
標簽,一會是a
標簽,一會是p
標簽。
就算是用beautifulSoup 來解也很難搞得齊全,用find_element的xpath 來定位也很難搞,也是要考慮層級結構的問題的。
這里可以用上 find_element
+ 遍歷后代節點的方法:
在上面的例子中,我只需要找到id=content 的第一層節點,然后找到該節點下的所有子節點和子孫節點下的text,這樣就可以把他們拼湊起來了:
1.1 獲取所有子孫節點的寫法:
如果你想要從特定的父元素開始獲取所有子節點,你可以結合使用標簽選擇器和.//
。
children_elements = parent_element.find_elements(By.XPATH, './/p')
在這個例子中,'.//p'
是一個XPath表達式,它意味著“選擇當前節點下所有的<p>
標簽,包括所有層級的后代節點”。
1.2 如果只是獲取子節點的話,則是:
children_elements = parent_element.find_elements(By.XPATH, './*')
其中,XPath中的'.'
代表當前節點,'/child::* '
代表選擇當前節點的所有直接子節點。
完整寫法:
from selenium import webdriver
from selenium.webdriver.common.by import By# 創建WebDriver實例,這里以Chrome為例
driver = webdriver.Chrome()# 打開目標網頁
driver.get("你的目標網頁URL")sleep(random.uniform(2, 3))#獲取文字部分
#獲取第一層節點,父親節點
parent_element=driver.find_element(By.ID ,'content')
#獲取所有
children_elements = parent_element.find_elements(By.XPATH, './/p')
new_content=''# 遍歷所有找到的<p>標簽的后代節點,并打印它們的標簽名和文本
for child in children_elements:#print(f"Tag: {child.tag_name}, Text: {child.text}")new_content=new_content+child.textprint('最后實現的文字:',new_content)
2. 獲取表格的部分
獲取表格的邏輯是:
1.使用find_element方法定位到表格元素。
2. 使用get_attribute('outerHTML')
打印表格內容(可選) 這個方法打印的是含有表格的源碼,而非表格的內容
3. for循環遍歷表格行和單元格,打印出每一行的單元格文本,以列表的形式顯示。
完整邏輯:
from selenium import webdriver
from selenium.webdriver.common.by import By# 創建WebDriver實例
driver = webdriver.Chrome()# 打開目標網頁
driver.get("http://example.com/some_page_with_tables.html")# 定位表格元素
table = driver.find_element(By.TAG_NAME, 'table')# 方法1:打印整個表格的HTML
print(table.get_attribute('outerHTML'))# 方法2:遍歷并打印表格的每一行和單元格內容
rows = table.find_elements(By.TAG_NAME, 'tr')
for row in rows:cells = row.find_elements(By.TAG_NAME, 'td')cell_texts = [cell.text for cell in cells]print(cell_texts)# 關閉瀏覽器
driver.quit()