【问题标题】:Scraping table from State of Texas Query Tool从德克萨斯州查询工具中抓取表格
【发布时间】:2020-01-19 19:24:28
【问题描述】:

我正在尝试在 Texas RRC Production Query Tool 上抓取此查询的所有结果:

http://webapps2.rrc.texas.gov/EWA/productionQueryAction.do?pager.pageSize=10&pager.offset=10&methodToCall=search&searchArgs.paramValue=|1=Operator|2=01|3=2019|4=01|5=2019|8=production|9=Operator|10=13|101=Both|102=01|204=district&rrcActionMan=H4sIAAAAAAAAAMWQy07DMBBFv6ZsKkUeJ6nSxSxCgS1PwSLqwsQmsZTW0cThIfnjmTiVimi3iN31vHzvCSAEygACEC6I6rL21u0fatKV2GKYuo9GUd0uN2S9Iavi7Id5VX0_yIRXEm8-1ZA07n2RloXgvsSFvLl-KVmmk-zJ6TEevh8Nfc1_JNpxP8Od8a3TT26juo4LOY77oTe1fbNG87tAceKrGqKlkpoh6RWp3bPqRjPZxdvekPKOgkQBIUUpYB2ySeezLvDoJqyP8yAQ0pjt0vk2huAlyQa1HTzZ2v-yAQc8V4c2h1_yxl_TmaOzXMUgd6ox9APCWWKwrc7NRmCcEUEwKciyYiLFoCDLw4qrp2f-Bfw3Uvd3sqQCAAA

我编写了一个程序,它将遍历每个页面以获取所有结果,但是当我尝试从表中实际抓取数据时,soup 变量返回 NoneType。我正在使用 bs4 4.6。这是我尝试过的:

current_url = driver.current_url
soup = BeautifulSoup(current_url,'lxml') #tried html.parser as well
table = soup.find("table", {"class":"DataGrid"})
for row in table.find_all('tr'):
    print(row)

我想在每一页上抓取表格,然后附加到熊猫数据框。我是否在这里遗漏了一些明显的东西来返回 NoneType?

【问题讨论】:

    标签: python web-scraping beautifulsoup


    【解决方案1】:

    由于您使用的是 Selenium,因此我创建了一个逻辑来抓取给定 url 的表值。我已使用 Csv 从此页面导出数据表。我相信这可以转换成熊猫数据框。

    import csv
    
        csvFile = open('DataDetails.csv', 'w')
        writer = csv.writer(csvFile)
        link = 'http://webapps2.rrc.texas.gov/EWA/productionQueryAction.do?pager.pageSize=10&pager.offset=10&methodToCall=search&searchArgs.paramValue=|1=Operator|2=01|3=2019|4=01|5=2019|8=production|9=Operator|10=13|101=Both|102=01|204=district&rrcActionMan=H4sIAAAAAAAAAMWQy07DMBBFv6ZsKkUeJ6nSxSxCgS1PwSLqwsQmsZTW0cThIfnjmTiVimi3iN31vHzvCSAEygACEC6I6rL21u0fatKV2GKYuo9GUd0uN2S9Iavi7Id5VX0_yIRXEm8-1ZA07n2RloXgvsSFvLl-KVmmk-zJ6TEevh8Nfc1_JNpxP8Od8a3TT26juo4LOY77oTe1fbNG87tAceKrGqKlkpoh6RWp3bPqRjPZxdvekPKOgkQBIUUpYB2ySeezLvDoJqyP8yAQ0pjt0vk2huAlyQa1HTzZ2v-yAQc8V4c2h1_yxl_TmaOzXMUgd6ox9APCWWKwrc7NRmCcEUEwKciyYiLFoCDLw4qrp2f-Bfw3Uvd3sqQCAAA'
        wait = WebDriverWait(driver, 10)
        driver.set_page_load_timeout(10)
        driver.get(link)
    
        #Finding Table Headers
        Headers = driver.find_elements_by_xpath("//table[@class='DataGrid']//tr/td[@class='PagerBanner']/parent::tr/following::tr[1]//a")
        items = []
        for header in Headers:
            items.append(header.text)
        writer.writerow(items)
    
    
        for i in range(10): #Assuming table size is 10
            values = driver.find_elements_by_xpath("//table[@class='DataGrid']//tr/td[@class='PagerBanner']/parent::tr/following::tr[1]/following::tr["+str(i+1)+"]/td")
            rows=[]
            for value in values:
                rows.append(value.text)
            writer.writerow(rows)#writing row values
    

    这是输出,

    操作员姓名 操作员编号 石油 (BBL) 套管头 (MCF) GW Gas (MCF) Condensate (BBL)

    4 SWIFT SERVICE LLC 953799 0 0 0 0

    94 操作中,LP 966260 0 0 0 0

    A & C OIL COMPANY, LLC 214 329 0 0 0

    A. N. MAC DIARMID CO. 572 108 0 0 0

    AAA 石油公司 148 25 1 0 0

    AARONMARK SERVICES, LLC 891 38 0 0 0

    AB 储备有限责任公司 893 0 0 0 0

    ABACO OPERATING, LLC 894 0 0 4,370 83

    ABRAXAS 石油公司 3125 9,356 10,706 0 0

    雅阁 GR 能源公司 3422 0 0 0 0

    【讨论】:

    • 谢谢@Sureshmani,这很有帮助!不幸的是,这种方式被证明太慢了,因为我需要遍历数千页。我选择下载页面上的 csv。但是,您的代码有助于理解如何抓取 html 表并写入后续行。
    【解决方案2】:

    我使用用户代理尝试了您的代码,并且成功了。我不确定您使用什么来向页面发出请求,所以我假设您使用的是requests(因为不需要 selenium 或其他网络浏览器模拟,一个简单的请求就可以了)。如果是这样,请在您的请求中添加以下参数:

    headers={'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.75 Safari/537.36'}

    编辑: 使用 selenium,您只需将页面源代码传递给 Beautifulsoup。您现在的错误是您将 url 传递给 beautifulsoup,而不是实际的 html。

    from selenium import webdriver
    from bs4 import BeautifulSoup
    
    driver = webdriver.Chrome()
    driver.get(
        'http://webapps2.rrc.texas.gov/EWA/productionQueryAction.do?pager.pageSize=10&pager.offset=10&methodToCall=search&searchArgs.paramValue=|1=Operator|2=01|3=2019|4=01|5=2019|8=production|9=Operator|10=13|101=Both|102=01|204=district&rrcActionMan=H4sIAAAAAAAAAMWQy07DMBBFv6ZsKkUeJ6nSxSxCgS1PwSLqwsQmsZTW0cThIfnjmTiVimi3iN31vHzvCSAEygACEC6I6rL21u0fatKV2GKYuo9GUd0uN2S9Iavi7Id5VX0_yIRXEm8-1ZA07n2RloXgvsSFvLl-KVmmk-zJ6TEevh8Nfc1_JNpxP8Od8a3TT26juo4LOY77oTe1fbNG87tAceKrGqKlkpoh6RWp3bPqRjPZxdvekPKOgkQBIUUpYB2ySeezLvDoJqyP8yAQ0pjt0vk2huAlyQa1HTzZ2v-yAQc8V4c2h1_yxl_TmaOzXMUgd6ox9APCWWKwrc7NRmCcEUEwKciyYiLFoCDLw4qrp2f-Bfw3Uvd3sqQCAAA')
    html = driver.page_source
    soup = BeautifulSoup(html, 'lxml')
    print(soup)
    table = soup.find("table", {"class": "DataGrid"})
    for row in table.find_all('tr'):
        print(row)
    
    

    【讨论】:

    • 感谢您的快速响应。我确实需要使用 Selenium,因为我需要设置查询,这涉及单击以更改各种参数。因此,请注意,我没有使用请求,因为在设置查询时,会根据查询参数生成一个相当独特且长的 url
    • 没问题。很高兴为您提供帮助
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多