使用selenium导航到页面,登录,运行填充搜索结果表的脚本。我用它来获取innerHTML代码。现在我正在尝试使用xpath从表中获取实际数据但是卡住了。
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from lxml import html
from lxml import etree
import requests
browser = webdriver.Chrome()
url = "www.url.com"
browser.get(url)
username = browser.find_element_by_id("username") #username form field
password = browser.find_element_by_id("password") #password form field
username.send_keys("myusername")
password.send_keys("mypassword")
password.send_keys(Keys.RETURN)
接下来,我导航到我感兴趣的页面并获取innerHTML
browser.get('a different url')
innerHTML= browser.execute_script('return document.body.innerHTML')
tree = html.fromstring(innerHTML)
有一张表
<tbody id='searchResultsPage'>
<tr>
<td>...</td>
<td>...</td>
</tr>
...
所以我试图遍历每一行和每一列以获取文本。我可以根据行号和列号构建一个循环来循环。所以我试过了:
thisItem = tree.xpath('//tbody[id="searchResultsPage"]/tr[position()=9]/td[position()=3]/text()')
print(thisRow)
我没有得到任何回报。
我还注意到其中一列是一堆带有类&#34;动作视图记录&#34;的链接。所以我尝试了下面的内容:
companies = tree.xpath('//a[@class="action-view-record"]/text()')
print(companies)
这是有效的(虽然没有解决我原来的问题,因为剩下的列只是标签)。但由于某种原因,它有时只能起作用。大约50%的时间代码没有返回任何内容,其余时间它返回正确的数据(公司列表)。
有关如何导航表的任何想法?为什么有时代码会中断?
答案 0 :(得分:0)
如果你有这张表:
<table id='searchResultsPage'>
<tr>
<td>...</td>
<td>...</td>
</tr>
</table>
使用正则表达式<table[^>]*>[\s\S]*?<\/table>\s*
这样:
import xml.etree.ElementTree as ET
import re
htmltable = re.findall(r'<tbody[^>]*>[\s\S]*?<\/tr>\s*', htmldoc)
table = ET.XML(htmltable[0])
rows = iter(table)
headers = [col.text for col in next(rows)]
print headers
你会得到:
['...', '...']
然后,根据表格的复杂程度,您可以这样做:
listtable = []
for row in rows:
values = [col.text for col in row]
listtable.append(dict(zip(headers, values)))
return listtable
答案 1 :(得分:0)
我会尝试类似的事情:
table_rows = driver.find_elements_by_xpath("//table[@id='table_id']//tr")
for row in rows:
row_columns = row.find_element_by_xpaths('//tr')
for column in columns:
do_something_with_column_text(column.text)
table_rows最终将成为具有id&#39; table_id&#39;的父表的所有表行的列表。然后迭代每行的每一列。