【问题标题】:Extracting data from a wikipedia page从维基百科页面提取数据
【发布时间】:2016-08-04 20:37:13
【问题描述】:

这个问题可能非常具体。我正在尝试从公司的维基百科页面中提取员工人数,例如https://en.wikipedia.org/wiki/3M

我尝试使用 Wikipedia python API 和一些正则表达式查询。但是,我找不到任何可靠的东西可以概括任何公司(不考虑例外情况)。

此外,由于表格行没有 id 或类,我无法直接访问该值。以下为出处:

<tr>
<th scope="row" style="padding-right:0.5em;">
<div style="padding:0.1em 0;line-height:1.2em;">Number of employees</div>
</th>
<td style="line-height:1.35em;">89,800 (2015)<sup id="cite_ref-FY_1-5" class="reference"><a href="#cite_note-FY-1">[1]</a></sup></td>
</tr>

所以,即使我有表格的 id - infobox vcard,所以我无法找到使用 beautifulSoup 抓取这些信息的方法。

有没有办法提取这些信息?它显示在页面开头右侧的汇总表中。

【问题讨论】:

  • 您应该发布自己解决问题的尝试。如果它总是与行名相同的表,你不能从 html 中提取它吗?
  • 更新了帖子。谢谢!
  • 也许不是最好的方法,但仍然:遍历所有 并在每个 的 innerHTML 中查找“员工人数”。然后解析innerHTML得到你想要的数据。

标签: python regex web-scraping wikipedia


【解决方案1】:

使用lxml.etree 代替BeautifulSoup,您可以通过XPath 表达式得到您想要的:

>>> from lxml import etree
>>> import requests
>>> r = requests.get('https://en.wikipedia.org/wiki/3M')
>>> doc = etree.fromstring(r.text)
>>> e = doc.xpath('//table[@class="infobox vcard"]/tr[th/div/text()="Number of employees"]/td')
>>> e[0].text
'89,800 (2015)'

让我们仔细看看这个表达式:

//table[@class="infobox vcard"]/tr[th/div/text()="Number of employees"]/td

也就是说:

查找所有将属性class 设置为infobox vcardtable 元素,并在这些元素中查找具有以下属性的tr 元素 子 th 元素有一个子 div 元素,该元素包含 文本“员工人数”,在 tr 元素内,获取 第一个td 元素。

【讨论】:

  • 解释和解决方案都非常清楚。非常感谢!
  • 如果您将 XPath 视为 Infocom 风格的文字冒险游戏,它会很有趣。
【解决方案2】:

为什么要重新发明轮子?

数据库百科

在 RDF 三元组中包含此信息。

参见例如 http://dbpedia.org/page/3M

【讨论】:

    猜你喜欢
    • 2016-10-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多