Python Can';无法从输出中删除大量空白行

Python Can';无法从输出中删除大量空白行,python,python-3.x,selenium,selenium-webdriver,web-scraping,Python,Python 3.x,Selenium,Selenium Webdriver,Web Scraping,我已经用python结合selenium编写了一个脚本,以从网页中获取一些信息。要访问内容,需要单击较大表格中每个名称旁边的+符号。当点击那些+符号完成时,所有连接到每个名称的表都会显示出来。我的脚本可以非常有效地完成它。然而,下一步是解析这些表格数据。这就是我被凌乱内容困扰的地方。每个表的数据都会被解析,但很多空行不知从何而来 我怎样才能去掉那些空行,继续只解析那些表格数据呢 这是我的剧本: from selenium import webdriver from selenium.webdr

我已经用python结合selenium编写了一个脚本,以从网页中获取一些信息。要访问内容,需要单击较大表格中每个名称旁边的
+
符号。当点击那些
+
符号完成时,所有连接到每个名称的表都会显示出来。我的脚本可以非常有效地完成它。然而,下一步是解析这些表格数据。这就是我被凌乱内容困扰的地方。每个表的数据都会被解析,但很多空行不知从何而来

我怎样才能去掉那些空行,继续只解析那些表格数据呢

这是我的剧本:

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

url = "replace with above link"

def get_info(driver,link):
    driver.get(link)
    for items in wait.until(EC.presence_of_all_elements_located((By.CSS_SELECTOR,"table.tableagmark img[style^='cursor:']"))):
        items.location
        items.click()
        wait.until(EC.invisibility_of_element_located((By.CSS_SELECTOR,"table[style='font-size:16px;']")))
    fetch_table()

def fetch_table():
    for items in wait.until(EC.presence_of_all_elements_located((By.CSS_SELECTOR, "table[style='font-size:16px;'] tr"))):
        data = [item.text for item in items.find_elements_by_css_selector("td")]
        print(data)

if __name__ == '__main__':
    driver = webdriver.Chrome()
    wait = WebDriverWait(driver,10)
    try:
        get_info(driver,url)
    finally:
        driver.quit()
这是输出的样子(在每个表格内容之前和之后):


假设
data
包含您的表,您可以使用
any
筛选出 空行

non_empty = [row for row in data if any(row)]

这里
any
返回
True
如果
的元素中至少有一个不是空的

如果您只是询问现在如何打印所有空结果,您可以编写一个过滤它们的循环。假设每一行都是一个
数据

最简单的方法是使用内有隐式布尔过滤器的隐式循环:

any(data)
对于序列
data
是真的,前提是
data
不是空的,并且
data
的至少一个元素是真的。空字符串是假的,非空字符串是真的。因此,这正是您想要的:它跳过了
[]
['',][/code>,但不是像
['Achanta',2018年4月16日11:24AM']
这样的事情

但是,如果你很难理解它,那么最好更明确一些:

for value in data:
    if value:
        print(data)
        break

您可以通过某种过滤跳过处理空文本节点,只需使用正确的选择器即可节省大量时间:

def get_info(driver,link):
    driver.get(link)
    for items in wait.until(EC.presence_of_all_elements_located((By.CSS_SELECTOR, "img[src='../images/plus.png']"))):
        items.click()
    fetch_table()

def fetch_table():
    for items in wait.until(EC.presence_of_all_elements_located((By.XPATH, "//td/table//tr[not(th)]"))):
        data = [item.text for item in items.find_elements_by_css_selector("td")]
        print(data)

(列中的列对应列)
有什么意义?这与iter(row)
做的事情一样,但更复杂、更慢,而且无论哪种方式都是不必要的,因为
any
可以像迭代器一样使用序列。同意,可以简单地使用
any(row)
。在时机成熟之前@abarnert无法接受你的答案。这真是惊人的成功。顺便说一下,你能在评论中告诉我为什么它会发生吗?谢谢。不行!!这肯定更好,我也应该坚持你的逻辑@Anderson爵士。预防胜于治疗。您能否为我提供一个
xpath
cssselector
,以便我能够区分正在解析的表(在名称下)。更清楚的是:如果名字是安得拉邦,我希望先解析名字,然后解析与之相连的表,否则很难区分。选择器非常简单:
//span[以(@id,“cphbodyrptu客户(lblStateName)开头]
[id^=“cphbodyrptu客户(lblStateName)]
,但是为了能够提取这些值,您可能需要完全修改脚本的结构。。。
for value in data:
    if value:
        print(data)
        break
def get_info(driver,link):
    driver.get(link)
    for items in wait.until(EC.presence_of_all_elements_located((By.CSS_SELECTOR, "img[src='../images/plus.png']"))):
        items.click()
    fetch_table()

def fetch_table():
    for items in wait.until(EC.presence_of_all_elements_located((By.XPATH, "//td/table//tr[not(th)]"))):
        data = [item.text for item in items.find_elements_by_css_selector("td")]
        print(data)