【问题标题】:Trying to extract dynamic table (url doesn't change) with selenium/beautiful soup尝试用硒/美丽汤提取动态表(网址不变)
【发布时间】:2018-12-06 22:34:07
【问题描述】:

我一直在尝试提取下表,我使用 chromedriver 自动输入,然后使用反验证码服务,我看到了一个示例,其中有人在生成表格后使用了漂亮的汤。

这是一个多页表,但我只是想在试图弄清楚如何点击其他页面之前获得第一页,我不确定我是否可以使用漂亮的汤,因为当我尝试代码时下面我得到第一行“没有要显示的属性”。如果没有搜索结果并且有。

我无法在此处嵌入图片,因为我的排名不够高(对不起,我对此很陌生,很烦人,我在发布几个小时之前试图弄清楚这一点),但是如果您访问该网站并且搜索“Al”或任何可以看到表格的输入 html https://claimittexas.org/app/claim-search

这是我的代码-

from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from bs4 import BeautifulSoup
from python_anticaptcha import AnticaptchaClient, NoCaptchaTaskProxylessTask
import re
import pandas as pd
import os
import time
import requests

parsed_table_date = []
url = "https://claimittexas.org/app/claim-search"
driver = webdriver.Chrome()
driver.implicitly_wait(15)
driver.get(url)
lastNameField = driver.find_element_by_xpath('//input[@id="lastName"]')
lastNameField.send_keys('Al')
api_key = #MY API key
site_key = '6LeQLyEUAAAAAKTwLC-xVC0wGDFIqPg1q3Ofam5M'  # grab from site
client = AnticaptchaClient(api_key)
task = NoCaptchaTaskProxylessTask(url, site_key)
job = client.createTask(task)
print("Waiting to solution by Anticaptcha workers")
job.join()
# Receive response
response = job.get_solution_response()
print("Received solution", response)
# Inject response in webpage
driver.execute_script('document.getElementById("g-recaptcha-response").innerHTML = "%s"' % response)
# Wait a moment to execute the script (just in case).
time.sleep(1)
# Press submit button
driver.find_element_by_xpath('//button[@type="submit" and @class="btn-std"]').click()
time.sleep(1)
html = driver.page_source
soup = BeautifulSoup(html, "lxml")
table = soup.find("table", { "class" : "claim-property-list" })
table_body = table.find('tbody')
#rows = table_body.find_all('tr')
for row in table_body.findAll('tr'):
    print(row)
    for col in row.findAll('td'):
        print(col.text.strip())

【问题讨论】:

    标签: python selenium selenium-webdriver web-scraping beautifulsoup


    【解决方案1】:

    因为这个,你得到了No properties to display.

    相反,您必须从元素的第二个索引进行迭代:

    //tbody/tr[2]/td[2]
    //tbody/tr[2]/td[3]
    //tbody/tr[2]/td[4]
    ...
    //tbody/tr[3]/td[2]
    //tbody/tr[3]/td[3]
    //tbody/tr[3]/td[4]
    ...
    

    因此,您必须像这样从迭代中指定起始索引:

    rows = driver.find_elements_by_xpath("//tbody/tr")
    for row in rows[1:]:
        print(row.text) # prints the whole row
        for col in row.find_elements_by_xpath('td')[1:]:
            print(col.text.strip())
    

    上面的代码有以下输出:

    CLAIM # this is button value
    37769557 1ST TEXAS LANDSCAPIN 6522 JASMINE ARBOR LANE HOUSTON TX 77088 MOTEL 6 OPERATING LP ACCOUNTS PAYABLE $351.00 2010
    37769557
    1ST TEXAS LANDSCAPIN
    6522 JASMINE ARBOR LANE
    HOUSTON
    TX
    77088
    MOTEL 6 OPERATING LP
    ACCOUNTS PAYABLE
    $351.00
    2010
    CLAIM # this is button value
    38255919 24X7 APARTMENT FIND OF TEXAS 1818 MOSTON DR SPRING TX 77386 NOT DISCLOSED NOT DISCLOSED $88.76 2017
    38255919
    24X7 APARTMENT FIND OF TEXAS
    1818 MOSTON DR
    SPRING
    ...
    

    【讨论】:

    • 这没有打印任何东西,不知道为什么 - 我也尝试加入一堆随机打印语句
    • 嗨!我已经添加了工作代码(并且也进行了测试),请看一下。由于验证码,只有一行我无法正确测试。但我觉得应该没问题。让我知道它是否也适合你。
    • 非常感谢!没有足够好的声誉来投票,否则我会。快速提问 - 你知道现在如何循环浏览其余页面吗?
    • 很高兴听到这个消息!您可以通过单击 downvote 按钮下方的灰色复选按钮来标记我的答案 )) 。 xPath to next 按钮是//li[@class = 'pagination-next']/a[@ng-click = 'selectPage(page + 1, $event)'],每次需要加载新页面时只需单击它。注意:您必须检查按钮是否可点击,如果不是 - 您在最后一页
    • 您知道是否可以使用 pandas 或美丽的汤更快地读取这些数据?这需要很长时间,而且我真的只需要属性值大于 1,000 美元的行(我打算稍后再寻找,但我不确定之前是否会更快)
    猜你喜欢
    • 2021-03-30
    • 1970-01-01
    • 1970-01-01
    • 2020-12-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-11
    • 1970-01-01
    相关资源
    最近更新 更多