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