python中driver.find_elements_by_xpath结果乱码

问题遇到的现象和发生背景
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from bs4 import BeautifulSoup

chrome_options = Options()
chrome_options.add_argument('--headless')
chrome_options.add_argument('--disable-gpu')
driver = webdriver.Chrome(chrome_options=chrome_options)
driver.get("https://www.znlzd.com/bqg/20997/")
# html=driver.page_source

a = driver.find_elements_by_xpath('/html/body/div[3]/div[2]/div/div[3]/span[2]/select//option')
for i in a:
    print(i)


driver.close()


问题相关代码,请勿粘贴截图
运行结果及报错内容
<selenium.webdriver.remote.webelement.WebElement (session="b709b4ffe71161ec4fa5f4b33573d689", element="039639af-36ce-449e-af3b-027f9b25ea16")>

我的解答思路和尝试过的方法
我想要达到的结果
<option value="/bqg/20997/index_2.html">第21章 - 40章</option>

img

原因
代码没错,输出的时候需要根据你的需求改一下输出

解决方法
Selenium WebDriverWait 获取元素文本需要使用 element.get_attribute('attributeName') 方式获取,以下是获取文本的属性名:

innerHTML:会返回元素的内部 HTML, 包含所有的HTML标签。
outerHTML: 获取整个元素对应的HTML文本内容
textContent:获取 HTML 文本,需要注意的是 textContent 是 W3C 兼容的文字内容属性,不支持 IE 浏览器。
innerText:获取 HTML 文本,与 textContent 不同的是 innerText 不是 W3C DOM 的指定内容,不支持 FireFox 浏览器。
value:获取带有 value 属性的值。

根据自己的需求进行选择输出

代码如下:

from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from bs4 import BeautifulSoup

chrome_options = Options()
chrome_options.add_argument('--headless')
chrome_options.add_argument('--disable-gpu')
driver = webdriver.Chrome(chrome_options=chrome_options)
# driver = webdriver.Chrome(chrome_options=chrome_options)
driver.get("https://www.znlzd.com/bqg/20997/")
# html=driver.page_source

a = driver.find_elements_by_xpath('/html/body/div[3]/div[2]/div/div[3]/span[2]/select//option')
for i in a:
    print(i.get_attribute('innerHTML'))
    print(i.get_attribute('outerHTML'))
    print(i.get_attribute('innerText'))
    print(i.get_attribute('value'))
    print(i.text)
    break # 这个实际需要删除,这里是测试只获取一个

driver.close()


输出为:

1章 - 20章
<option value="/bqg/20997/index_1.html" selected="selected">第1章 - 20章</option>
第1章 - 20章
/bqg/20997/index_1.html
第1章 - 20

看下上面的输出哪个符合你的需求,
按照你题目中的要求的话,想要<option value="/bqg/20997/index_2.html">第21章 - 40章</option>的话,
就使用

  print(i.get_attribute('outerHTML'))

————————————————

参考链接:


selenium获取元素信息的常用方法_omaidb的技术博客_51CTO博客 selenium获取元素信息的常用方法,selenium获取标签内信息获取元素对应的HTML#获取整个元素对应的HTML文本内容element.get_attribute('outerHTML')#获取元素内部的HTML文本内容element.get_attribute('innerHTML')获取输入框里面的文字对于input输入框的元素 https://blog.51cto.com/omaidb/4120931


如有问题及时沟通

那个不是乱码,只是你输出的是对象,改成这样就好了。

from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from bs4 import BeautifulSoup

chrome_options = Options()
chrome_options.add_argument('--headless')
chrome_options.add_argument('--disable-gpu')
driver = webdriver.Chrome(chrome_options=chrome_options)
driver.get("https://www.znlzd.com/bqg/20997/")
# html=driver.page_source

a = driver.find_elements_by_xpath('/html/body/div[3]/div[2]/div/div[3]/span[2]/select//option')
for i in a:
    print(i.text)

driver.close()