有一个HTML - 如何使用xpath从其表中获取数据

时间:2018-05-08 19:04:46

标签: python xpath

使用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%的时间代码没有返回任何内容,其余时间它返回正确的数据(公司列表)。

有关如何导航表的任何想法?为什么有时代码会中断?

2 个答案:

答案 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;的父表的所有表行的列表。然后迭代每行的每一列。