如何在单击按钮后抓取CSV文件中列出的多个页面的表格?硒, 蟒蛇

How to scrape tables after on click button for multiple pages listed in a CSV file? Selenium, Python

提问人:Sharon Vijn 提问时间:8/30/2020 最后编辑:Sharon Vijn 更新时间:8/30/2020 访问量:425

问:

我想使用 pd.read_html 函数抓取显示多个 URL 的表中的所有信息。网站的一个例子是:https://www.top40.nl/10cc/10cc-donna-5867 我通过 csv 文件导入。

进入网站并单击“Songinfo”选项卡后,包含所有相关信息的表格将变为可见。请在下面找到我的代码。Python 给出错误:找不到表和/或无法从列表中解析。很高兴听到有关如何更正我的代码的任何建议:

df_list = []

with open(r"C:\Users\nlvijn02\Documents\Personal documents\Sony\Test_input_links.csv") as file:    
    reader = csv.reader(file)
    for row in reader:
        print(row[0])
        driver.get(row[0])
                
        driver.find_element_by_xpath("//a[@href='#songinfo']").click()
        
        table = driver.find_elements_by_xpath("""//*[@id="songinfo"]/table""")
    
        df_list.append(pd.read_html(table))
            
    df = pd.concat(df_list)
        
driver.close()        
df.to_csv("details.csv")

请在下面找到表格的 HTML 代码:

<div id="songinfo" class="tab-pane active" aria-expanded="true"><h2>Songinformatie</h2><table class="table-songinfo"><tbody><tr><th>Artiest</th><td><a data-linktype="artist" href="https://www.top40.nl/top40-artiesten/10cc">10cc</a></td></tr><tr><th>&nbsp;</th><th style="text-align: left;">A-kant</th></tr><tr><th>Titel</th><td>
                                                                                                            Donna                                                                                                   </td></tr><tr><th>Lengte</th><td>
                                                                                                            02:55
                                                                                                    </td></tr><tr><th>Componist(en)</th><td>
                                                                                                            Kevin Godley, Lol Creme
                                                                                                    </td></tr><tr><th>&nbsp;</th><th style="text-align: left;">B-kant</th></tr><tr><th>Titel</th><td>
                                                                                                            Hot Sun Rock
                                                                                                    </td></tr><tr><th>Lengte</th><td>
                                                                                                            03:00
                                                                                                    </td></tr><tr><th>Componist(en)</th><td>
                                                                                                            Eric Stewart, Graham Gouldman
                                                                                                    </td></tr><tr><th colspan="2">&nbsp;</th></tr><tr><th>Platenlabel</th><td>
                                                                                                    UK
                                                                                            </td></tr><tr><th>Catalogusnr</th><td>
                                                                                                    UK 6
                                                                                            </td></tr><tr><th>Hoogste positie UK</th><td>
                                                                                                    2
                                                                                            </td></tr></tbody></table></div>
python selenium selenium-webdriver 网页抓取 chrome-web-driver

评论

0赞 Lars Skaug 8/30/2020
如果您访问给出的网站,您会看到您正在寻找的元素吗?最好创建一个方法,对 CSV 中某一行的内容进行尝试。第一。如果它适用于一个,则遍历所有 URL。print(row[0])find_elements
0赞 Sharon Vijn 8/30/2020
感谢您的快速回复。但是,这就是我在'table = driver.find_elements_by_xpath(“”“//*[@id=”songinfo“]/table”“”)'中所做的。这是我想从中抓取数据的表的 XPATH。
0赞 Sharon Vijn 8/30/2020
@arundeepchohan 感谢您的回答,但是当我只输入 1 “时,它会给我:无效的语法。这就是为什么我输入了三次。不幸的是,这不是解决方案。如果有帮助,我已经添加了表格的 HTML。我想我在循环中做错了什么?
0赞 Arundeep Chohan 8/30/2020
table = driver.find_element_by_xpath(“//*[@id='songinfo']/table”) 它是一个对象,而不是一个列表。

答:

0赞 Ahmed Mamdouh 8/30/2020 #1
df_list = []

with open(r"C:\Users\nlvijn02\Documents\Personal documents\Sony\Test_input_links.csv") as file:
    reader = csv.reader(file)
    for row in reader:
        print(row[0])
        driver.get(row[0])

        driver.find_element_by_xpath("//a[@href='#songinfo']").click()

        table = driver.find_element_by_xpath("""//*[@id="songinfo"]/table""")

        df_list.append(pd.read_html(table.get_attribute('outerHTML')))

    df = pd.concat(df_list)

driver.close()
df.to_csv("details.csv")

我在您的代码中修改了 2 行。

  1. find_elements_by_xpath => find_element_by_xpath
  2. 表 => table.get_attribute('outerHTML')

如果您测试我的代码并让我知道结果,我会很高兴。 此致敬意

评论

0赞 Sharon Vijn 8/30/2020
非常感谢艾哈迈德,它完美地从每个表中抓取了所有数据。我唯一纠结的是如何将数据放入csv文件中。由于 'df = pd.concact(df_list) 不起作用。我收到此错误:无法连接类型为“<class 'list'>”的对象;只有 Series 和 DataFrame Obj 有效。你对此有什么建议吗?
0赞 Ahmed Mamdouh 8/30/2020
您可以将“df_list.append”修改为“df_list.extend”。
0赞 Ahmed Mamdouh 8/30/2020
您可以将“df_list.append”修改为“df_list.extend”,因为pd.read_html的返回值是一种列表,所以我认为您最好使用df_list.extend而不是df_list.append。