python selenium搜索查询提供了多个结果。如何选择我的搜索查询?

时间:2017-06-08 16:33:43

标签: python selenium web-scraping beautifulsoup

我用selenium进行了搜索查询。之后我得到了多个结果。现在的问题是,只有一个链接是正确的。我可以从多个结果中选择链接吗?并解析结果中的数据。 我有一个列表,每次进行搜索查询时,结果有时可能会改变10或15。

以下代码将始终选择第一个结果,但在这种情况下,我正在寻找4个链接:

代码:

from selenium import webdriver
from bs4 import BeautifulSoup
import time

driver = webdriver.Chrome()
driver.get("url")
#time.sleep(5)

username = driver.find_element_by_name("p_name")
#time.sleep(1)
username.send_keys("xxxxx)
#username.clear()
driver.find_element_by_xpath("html/body/form/table[6]/tbody/tr/td[2]/input").click()
driver.find_element_by_xpath("html/body/form/table[3]/tbody/tr[2]/td[4]/a").click()

html = driver.page_source

soup =BeautifulSoup(html)

for tag in soup.find_all('table'):
    print tag.text

3 个答案:

答案 0 :(得分:1)

您知道搜索结果页面中的条目的一般形式,即它们被大写并且被特殊字符剪掉。假设您有这样的搜索页面,您可以使用这些知识和selenium以xpath表达式搜索包含您想要的内容的文本。

>>> from selenium import webdriver
>>> driver = webdriver.Chrome()
>>> driver.get('http://egov.sos.state.or.us/br/pkg_web_name_srch_inq.do_name_srch?p_name=OREGON%20BUD%20COMPANY%2C%20LLC&p_regist_nbr=&p_srch=PHASE1&p_print=FALSE&p_entity_status=ACTINA')
>>> driver.find_element_by_xpath('.//*[contains(text(),"OREGON BUD COMPANY LLC")]/../..').text
'   4 DLLC ACT 1097010-94   CUR   OREGON BUD COMPANY LLC Search'

我只是将文本转储到整行。您需要从父tr元素中提取实际需要的文本项。

PS:在https://gist.github.com/LeCoupa/8c305ec8c713aad07b14处有一个很好的xpath表达式页面。

答案 1 :(得分:0)

答案是使用只返回一个结果的更好的选择器。我更喜欢CSS选择器,但如果您愿意,XPath的过程基本相同。

在Chrome中获取CSS选择器:

  1. 右键点击元素,然后选择'检查'
  2. 右键单击DevTools的DOM资源管理器中的元素
  3. 选择"复制" > "复制选择器" (或者你也可以在这里获得XPath)

    driver.find_element_by_css_selector((" body> form> table:nth-​​child(4)> tbody> tr:nth-​​child(2)> td:nth-​​child(2)> ;输入[type =' text']"))。sendKeys(" Timothy")

    driver.find_element_by_css_selector((" body> form> table:nth-​​child(5)> tbody> tr> td:nth-​​child(2)> input [type =&# 39;文本']&#34))的SendKeys("柯普&#34)

答案 2 :(得分:0)

我认为你可以使用

driver.find_element_by_partial_link_text("OREGON BUD COMPANY LLC")

而不是

driver.find_element_by_xpath('.//*[contains(text(),"OREGON BUD COMPANY LLC")]/../..').text

这将遵循完全匹配,并将进入下一页。