我正在尝试在Python 3.6上使用BeautifulSoup来抓取这个html表,以便将其导出到csv,如下面的脚本中所示。我使用了前一个例子,试图适应我的情况。
url = 'http://finanzalocale.interno.it/apps/floc.php/certificati/index/codice_ente/2050540010/cod/4/anno/2015/md/0/cod_modello/CCOU/tipo_modello/U/cod_quadro/03'
html =urlopen(url).read
soup = BeautifulSoup(html(), "lxml")
table = soup.select_one("table.tabfin")
headers = [th.text("iso-8859-1") for th in table.select("tr th")]
但我收到了一个AttributeError。
AttributeError:'NoneType'对象没有属性'select'
然后我会尝试用
导出到csvwith open("abano_spese.csv", "w") as f:
wr = csv.writer(f)
wr.writerow(headers)
wr.writerows([[td.text.encode("iso-8859-1") for td in row.find_all("td")] for row in table.select("tr + tr")])
这有什么问题?对不起,如果有一些愚蠢的错误,我是python的绝对初学者。
谢谢大家
答案 0 :(得分:1)
抓取 Ministero dell'Interno 的网站时出现问题。我们试试这段代码:
url = 'http://finanzalocale.interno.it/apps/floc.php/certificati/index/codice_ente/2050540010/cod/4/anno/2015/md/0/cod_modello/CCOU/tipo_modello/U/cod_quadro/03'
html = urlopen(url).read()
soup = BeautifulSoup(html)
print soup.prettify()
你得到:
La suarichiestaèstatabloccata dai sistemi posti a protezione del sito web。
Si prega diassicurarsidell'integritàdellapostazione utilizzata e riprovare。
刮痧似乎不受欢迎,或者他们认为您的请求中存在令人讨厌的内容,这就是为什么代码中table = None
会得到AttributeError
可能的解决方案:
**在开始其他任何事情之前,请检查 Ministero dell'Interno 的数据政策是否允许脚本使用他们的数据,否则这不是获得所需内容的方式。**
第2步:您可以尝试将自定义标头传递给您的请求以充当浏览器。如,
headers = {"User-Agent": "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.2.8) Gecko/20100722 Firefox/3.6.8 GTB7.1 (.NET CLR 3.5.30729)"}
r = requests.get(url, headers = headers)
soup = BeautifulSoup(r.text, 'lxml')
现在你有了soup
。请注意,页面中有3个不同的<table class="tabfin">
。我想你需要第二个:
table = soup.select("table.tabfin")[1]
通过这种方式,它有效。对不起,如果我听起来有点迂腐,但我担心这种方法应该不符合他们的数据许可证。请在刮之前检查一下。