使用 Selenium Python 解析 HTML 和读取 HTML Table
Parse HTML and Read HTML Table with Selenium Python
我正在将我的一些网络抓取代码从 R 转换为 Python(我无法让 geckodriver 与 R 一起工作,但它可以与 Python 一起工作)。无论如何,我正在尝试了解如何使用 Python 解析和读取 HTML tables。快速背景,这是我的 R 代码:
doc <- htmlParse(remDr$getPageSource()[[1]],ignoreBlanks=TRUE, replaceEntities = FALSE, trim=TRUE, encoding="UTF-8")
WebElem <- readHTMLTable(doc, stringsAsFactors = FALSE)[[7]]
我会将 HTML 页面解析为 doc 对象。然后我会从 doc[[1]]
开始,然后逐个增加数字,直到看到我想要的数据。在这种情况下,我到达 doc[[7]]
并看到了我想要的数据。然后我会读取 HTML table 并将其分配给 WebElem 对象。最终我会把它变成一个数据框并使用它。
所以我在 Python 中所做的是:
html = None
doc = None
html = driver.page_source
doc = BeautifulSoup(html)
然后我开始玩 doc.get_text
但我真的不知道如何只获取我想看的数据。我想看到的数据就像一个 10x10 矩阵。当我使用 R 时,我只会使用 doc[[7]]
并且该矩阵几乎是一个完美的结构,我可以将其转换为数据帧。但是,我似乎无法使用 Python 做到这一点。任何建议将不胜感激。
更新:
我已经能够使用 Python 获取我想要的数据--我关注此博客以使用 python 创建数据框:Python Web-Scraping. Here is the website that we are scraping in that blog: Most Popular Dog Breeds。在那个博客 post 中,你必须通过元素来工作,创建一个字典,遍历 table 的每一行并将数据存储在每一列中,然后你就可以创建一个数据框。
使用 R,我唯一需要编写的代码是:
doc <- htmlParse(remDr$getPageSource()[[1]],ignoreBlanks=TRUE, replaceEntities = FALSE, trim=TRUE, encoding="UTF-8")
df <- as.data.frame(readHTMLTable(doc, stringsAsFactors = FALSE)
有了这个,我就有了一个非常好的数据框,我只需要调整列名和数据类型——它看起来像这样的代码:
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 更适合数据帧(至少在我看来是这样,但我可以是错的)?
首先,阅读 Selenium with Python,您将基本了解 Selenium 如何与 Python 一起工作。
然后,如果你想在 Python 中定位元素,有两种方法:
- 使用Selenium API,可以参考Locating Elements
- 使用BeautifulSoup,有很好的文档可以阅读
BeautifulSoupDocumentation
好的,经过一番深入挖掘后,我觉得我找到了一个很好的解决方案——与 R 的解决方案相匹配。如果您正在查看上面 link 中提供的 HTML,Dog Breeds,并且你有网络驱动程序 运行ning link 你可以 运行 以下代码:
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
我觉得这比像博客建议的那样处理标签、创建字典和遍历每一行数据要容易得多。这可能不是最正确的做事方式,我是 Python 的新手,但它可以快速完成工作。我希望这对一些网络抓取者有所帮助。
tbl = driver.find_element_by_xpath("//html/body/main/article/section[2]/div/article/table").get_attribute('outerHTML')
df = pd.read_html(tbl)
效果很好。
我正在将我的一些网络抓取代码从 R 转换为 Python(我无法让 geckodriver 与 R 一起工作,但它可以与 Python 一起工作)。无论如何,我正在尝试了解如何使用 Python 解析和读取 HTML tables。快速背景,这是我的 R 代码:
doc <- htmlParse(remDr$getPageSource()[[1]],ignoreBlanks=TRUE, replaceEntities = FALSE, trim=TRUE, encoding="UTF-8")
WebElem <- readHTMLTable(doc, stringsAsFactors = FALSE)[[7]]
我会将 HTML 页面解析为 doc 对象。然后我会从 doc[[1]]
开始,然后逐个增加数字,直到看到我想要的数据。在这种情况下,我到达 doc[[7]]
并看到了我想要的数据。然后我会读取 HTML table 并将其分配给 WebElem 对象。最终我会把它变成一个数据框并使用它。
所以我在 Python 中所做的是:
html = None
doc = None
html = driver.page_source
doc = BeautifulSoup(html)
然后我开始玩 doc.get_text
但我真的不知道如何只获取我想看的数据。我想看到的数据就像一个 10x10 矩阵。当我使用 R 时,我只会使用 doc[[7]]
并且该矩阵几乎是一个完美的结构,我可以将其转换为数据帧。但是,我似乎无法使用 Python 做到这一点。任何建议将不胜感激。
更新:
我已经能够使用 Python 获取我想要的数据--我关注此博客以使用 python 创建数据框:Python Web-Scraping. Here is the website that we are scraping in that blog: Most Popular Dog Breeds。在那个博客 post 中,你必须通过元素来工作,创建一个字典,遍历 table 的每一行并将数据存储在每一列中,然后你就可以创建一个数据框。
使用 R,我唯一需要编写的代码是:
doc <- htmlParse(remDr$getPageSource()[[1]],ignoreBlanks=TRUE, replaceEntities = FALSE, trim=TRUE, encoding="UTF-8")
df <- as.data.frame(readHTMLTable(doc, stringsAsFactors = FALSE)
有了这个,我就有了一个非常好的数据框,我只需要调整列名和数据类型——它看起来像这样的代码:
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 更适合数据帧(至少在我看来是这样,但我可以是错的)?
首先,阅读 Selenium with Python,您将基本了解 Selenium 如何与 Python 一起工作。
然后,如果你想在 Python 中定位元素,有两种方法:
- 使用Selenium API,可以参考Locating Elements
- 使用BeautifulSoup,有很好的文档可以阅读 BeautifulSoupDocumentation
好的,经过一番深入挖掘后,我觉得我找到了一个很好的解决方案——与 R 的解决方案相匹配。如果您正在查看上面 link 中提供的 HTML,Dog Breeds,并且你有网络驱动程序 运行ning link 你可以 运行 以下代码:
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
我觉得这比像博客建议的那样处理标签、创建字典和遍历每一行数据要容易得多。这可能不是最正确的做事方式,我是 Python 的新手,但它可以快速完成工作。我希望这对一些网络抓取者有所帮助。
tbl = driver.find_element_by_xpath("//html/body/main/article/section[2]/div/article/table").get_attribute('outerHTML')
df = pd.read_html(tbl)
效果很好。