Python:通过xpath获取html表格数据

标签 python html python-2.7 parsing xpath

我觉得从 html 表中提取数据非常困难,需要为每个站点自定义构建。我非常希望在这里被证明是错误的。

是否有一种简单的 pythonic 方法可以通过仅使用感兴趣的表的 url 和 xpath 从网站中提取字符串和数字?

例子:

url_str = 'http://www.fdmbenzinpriser.dk/searchprices/5/'
xpath_str = //*[@id="sortabletable"]

我曾经有一个脚本可以从这个站点获取数据。但是丢了。我记得我正在使用标签 '' 和一些字符串逻辑......不是很漂亮

我知道像 thingspeak 这样的网站可以做这些事情..

最佳答案

有一个相当通用的模式,您可以使用它来解析许多,但不是 所有,表格。

import lxml.html as LH
import requests
import pandas as pd
def text(elt):
    return elt.text_content().replace(u'\xa0', u' ')

url = 'http://www.fdmbenzinpriser.dk/searchprices/5/'
r = requests.get(url)
root = LH.fromstring(r.content)

for table in root.xpath('//table[@id="sortabletable"]'):
    header = [text(th) for th in table.xpath('//th')]        # 1
    data = [[text(td) for td in tr.xpath('td')]  
            for tr in table.xpath('//tr')]                   # 2
    data = [row for row in data if len(row)==len(header)]    # 3 
    data = pd.DataFrame(data, columns=header)                # 4
    print(data)
  1. 您可以使用 table.xpath('//th') 查找列名。
  2. table.xpath('//tr') 返回行,对于每一行,tr.xpath('td') 返回表示表格的一个“单元格”的元素。
  3. 有时您可能需要过滤掉某些行,例如在本例中,行 值少于 header 。
  4. 您如何处理数据(列表的列表)由您决定。这里我只用 Pandas 做演示:

        Pris                               Adresse       Tidspunkt
0       8.04           Brovejen 18 5500 Middelfart   3 min 38 sek 
1       7.88         Hovedvejen 11 5500 Middelfart   4 min 52 sek 
2       7.88         Assensvej 105 5500 Middelfart   5 min 56 sek 
3       8.23    Ejby Industrivej 111 2600 Glostrup   6 min 28 sek 
4       8.15            Park Alle 125 2605 Brøndby  25 min 21 sek 
5       8.09           Sletvej 36 8310 Tranbjerg J  25 min 34 sek 
6       8.24      Vindinggård Center 29 7100 Vejle   27 min 6 sek 
7     7.99 *         Søndergade 116 8620 Kjellerup  31 min 27 sek 
8     7.99 *   Gertrud Rasks Vej 1 9210 Aalborg SØ  31 min 27 sek 
9     7.99 *              Sorøvej 13 4200 Slagelse  31 min 27 sek 

关于Python:通过xpath获取html表格数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28305578/

相关文章:

python - vscode 智能感知与 PyQt4 配合使用太慢

python - 如何以HDF5格式提供caffe多标签数据?

javascript - 内部选择使 slidedown div(父级)消失

python - 虾 4 : 400 ERROR when trying to download a users comments

python Pandas : Append rows of DataFrame and delete the appended rows

python - 使用Pycharm导入pandas报错

html - 我可以对网站的整个宽度使用百分比吗?

python - 在 BeautifulSoup 中替换文本而不转义

python - 如何使用 Python 选择不在表单内的选项?

python - 根据列表中的值过滤数据框