【问题标题】:Trying to fetch text from a web element gives me a error 'list' object has no attribute 'text'尝试从 Web 元素中获取文本给我一个错误“列表”对象没有属性“文本”
【发布时间】:2015-12-29 02:09:48
【问题描述】:

当我试图从这个Link 的网络元素中获取一些文本时。我正在尝试获取公司名称/电子邮件等信息。我编写的代码如下。每次我执行这段代码。它给了我一个错误。

from selenium import webdriver
from selenium.common.exceptions import NoSuchElementException
from selenium.webdriver.common.keys import Keys
import time
from lxml import html
import requests
import xlwt
import urllib
import re
from bs4 import BeautifulSoup
import requests

browser = webdriver.Firefox() # Get local session of firefox

# 0 wait until the pages are loaded
browser.implicitly_wait(3) # 3 secs should be enough. if not, increase it

browser.get("http://ae.bizdirlib.com/taxonomy/term/1493") # Load page
#browser.get("http://ae.bizdirlib.com") # Load page

#links =[]
link = browser.find_element_by_css_selector("h2 > a")



#for link in links:
link.send_keys(Keys.CONTROL + Keys.RETURN)
link.send_keys(Keys.CONTROL + Keys.PAGE_UP)

companyNameElement = **browser.find_elements_by_css_selector("div.content.clearfix > div > fieldset> div > ul > li > span").text**
print companyName

当我将 .text 放入 find_elements_by_css_selector 时,它会引发错误。我该如何调试和去做。

【问题讨论】:

标签: python python-2.7 selenium selenium-webdriver web-scraping


【解决方案1】:

不要使用 css 选择器。您可以使用目标 UL 的 xpath(其中包含整个数据),然后给出 [li] 的路径(以便它可以获取该特定 UL 中的所有 li 元素)。
像这样:
browser.find_element_by_xpath("//*[@id='node-946273']/div[1]/div/fieldset[1]/div/ul[1]") .find_elements_by_tagName("li")
希望它能在 python 中工作
我可以通过使用下面的代码来实现上述结果:
注意:它是在java中,请将此代码转换为python。

 WebDriver driver = new FirefoxDriver();
 driver.get("http://ae.bizdirlib.com/node/946273");
 driver.manage().timeouts().implicitlyWait(20, TimeUnit.SECONDS);
 List<WebElement> link = driver.findElement(By.xpath("//*[@id='node-946273']/div[1]/div/fieldset[1]/div/ul[1]")).findElements(By.tagName("li"));

    for (WebElement link2 : link) {

        System.out.println("" + link2.getText());

    }

即使您可以根据所选的 url 传递动态 xpath。
输出: http://i.stack.imgur.com/NzGML.png

【讨论】:

  • 问题是我希望获取信息是动态的。获取信息将在多个页面上执行。来自主页ae.bizdirlib.com/taxonomy/term/1493。我的代码将执行以下操作,打开一个新选项卡,仅复制公司、电子邮件等文本并将其粘贴到 Excel 中。所以在 xpath 中,随着链接是动态的,数字会不断变化,这就是为什么我要考虑 css 选择器。
  • 仍然可以通过 xpath 解决,因为每个目标页面具有相同的结构。有两种可能的解决方案:首先动态解析 url 并获取 id,然后在 xpath 中传递该 id。第二种方法更简单,只需使用以下代码: browser.find_element_by_xpath("//div[1]/div/fieldset[1]/div/ul[1]") .find_elements_by_tagName("li")
  • browser.find_element_by_xpath("//div[1]/div/fieldset[1]/div/ul[1]") .find_elements_by_tagName("li") ,此代码适用于每个页面你提到的。因为这段代码只关注特定位置的 ul。
【解决方案2】:
browser.find_elements_by_css_selector("div.content.clearfix > div > fieldset> div > ul > li > span")

返回一个数组/元素列表。

所以,

browser.find_elements_by_css_selector("div.content.clearfix > div > fieldset> div > ul > li > span")`[0]`.text

必须为你工作

【讨论】:

  • IndexError: 列表索引超出范围错误!!可能是什么错误?
  • 您网站中的所有元素都不匹配选择器div.content.clearfix &gt; div &gt; fieldset&gt; div &gt; ul &gt; li &gt; span
  • 我正在尝试获取公司名称、电子邮件、电话号码。从网站。什么可能是正确的 CSS 选择器?我之前在堆栈溢出中使用这个,有人建议使用 css 选择器。 .content.clearfix&gt;div&gt;fieldset&gt;div&gt;ul&gt;li&gt;span
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多