使用Selenium Python解析HTML并读取HTML表格

6

我正在将一些网络爬虫代码从R语言转换为Python(我无法让geckodriver在R中运行,但它在Python中能够正常工作)。无论如何,我正在尝试理解如何使用Python解析和读取HTML表格。简单介绍一下,以下是我的R代码:

doc <- htmlParse(remDr$getPageSource()[[1]],ignoreBlanks=TRUE, replaceEntities = FALSE, trim=TRUE, encoding="UTF-8")

WebElem <- readHTMLTable(doc, stringsAsFactors = FALSE)[[7]]

我会将HTML页面解析为文档对象。然后我将从doc[[1]]开始,不断向更高的数字移动,直到看到我想要的数据。在这种情况下,我到了doc[[7]],并看到了我想要的数据。然后,我将读取该HTML表格,并将其分配给WebElem对象。最终,我会将其转换为数据框并进行操作。
所以,我在Python中所做的是:
html = None
doc = None
html = driver.page_source
doc = BeautifulSoup(html)

然后我开始尝试使用doc.get_text,但我不太知道如何获取我想要查看的数据。我想要查看的数据类似于一个10x10的矩阵。当我使用R时,我只需要使用doc[[7]],那个矩阵几乎就是一个完美的结构,可以轻松将其转换为dataframe。然而,我似乎无法在Python中做到这一点。非常感谢任何建议。
更新:
我已经能够使用Python获得我想要的数据-我按照这篇博客创建了一个包含Python的dataframe:Python Web-Scraping。这是我们在那篇博客中正在抓取的网站:Most Popular Dog Breeds。在那篇博客文章中,您必须逐步处理元素,创建字典,循环遍历表格的每一行并存储每列中的数据,然后您就能够创建一个dataframe。
对于R,我唯一需要编写的代码是: doc <- htmlParse(remDr$getPageSource()[[1]],ignoreBlanks=TRUE, replaceEntities = FALSE, trim=TRUE, encoding="UTF-8") df <- as.data.frame(readHTMLTable(doc, stringsAsFactors = FALSE) 只有这样,我就有了一个非常好的dataframe,只需要调整列名和数据类型即可-仅使用该代码,它看起来就像这样: NULL.V1 NULL.V2 NULL.V3 NULL.V4 1 BREED 2015 2014 2013 2 Retrievers (Labrador) 1 1 1 3 German Shepherd Dogs 2 2 2 4 Retrievers (Golden) 3 3 3 5 Bulldogs 4 4 5 6 Beagles 5 5 4 7 French Bulldogs 6 9 11 8 Yorkshire Terriers 7 6 6 9 Poodles 8 7 8 10 Rottweilers 9 10 9 在Python中是否没有类似的工具可以使得这个过程更简单一些,或者这在R中更简单是因为R更适合dataframes(至少对我来说是这样的,但我可能是错误的)?

1
最重要的建议 - 始终将URL添加到您的数据中。每个页面都不同,我们必须查看HTML才能提供任何建议。 - furas
嗨@furas,我想添加它,但这是一个私有URL。我知道这会让事情变得困难。如果我在我的帖子中创建类似的矩阵,这会有所帮助吗? - d84_n1nj4
我现在无法与R进行任何比较,因为我无法让RSelenium正常工作。基本上,我所做的是将列标题解析为带有空值的字典,然后使用另一个解析附加值。然后将其保存为数据框。似乎在R中,我可以像上面解释的那样引用html表位置,并且它几乎已经以数据框格式存在。当RSelenium再次更新时,我会保持这个问题开放并澄清/回答这个问题。 - d84_n1nj4
我偶然发现了这篇博客,对我有所帮助:链接。在链接引用的HTML与我正在查看的HTML代码类似。我按照博客中的步骤创建了一个数据框。这就是我希望能运行RSelenium以便进行比较的地方。 - d84_n1nj4
@furas,我希望我的更新问题有所帮助。如果不行,请告诉我还能做些什么来改进它。谢谢。 - d84_n1nj4
显示剩余2条评论
3个回答

16
经过一番深入研究,我找到了一个很好的解决方案——与R语言的解决方案相匹配。如果你正在查看上面链接提供的HTML页面Dog Breeds,并且已经为该链接运行了Web驱动程序,那么可以运行以下代码: tbl = driver.find_element_by_xpath("//html/body/main/article/section[2]/div/article/table").get_attribute('outerHTML') df = pd.read_html(tbl) 然后你就可以用只有几行代码的方式获得一个非常不错的数据框架: In [145]: df Out[145]: [ 0 1 2 3 0 BREED 2015 2014 2013.0 1 Retrievers (Labrador) 1 1 1.0 2 German Shepherd Dogs 2 2 2.0 3 Retrievers (Golden) 3 3 3.0 4 Bulldogs 4 4 5.0 5 Beagles 5 5 4.0 我认为这比通过标签、创建字典、循环每一行数据来处理要容易得多,正如博客所建议的那样。这可能不是最正确的做法,因为我是新手,但能够快速完成任务。我希望这能对一些同样从事网页抓取的人有所帮助。

1
import pandas as pd - d84_n1nj4

2
tbl = driver.find_element_by_xpath("//html/body/main/article/section[2]/div/article/table").get_attribute('outerHTML')
df  = pd.read_html(tbl)

它运作得相当不错。


-3

首先,阅读Python中的Selenium,您将了解Selenium如何与Python配合使用的基本概念。

然后,如果您想在Python中定位元素,有两种方法:

  1. 使用Selenium API,您可以参考定位元素
  2. 使用BeautifulSoup,这里有一份很好的文档BeautifulSoup文档

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接