我需要从html页面中提取csv文件,见下文,一旦我得到它,我可以用它来做。下面是从先前的赋值中提取该特定html代码行的代码。该网址是' https://vincentarelbundock.github.io/Rdatasets/datasets.html' 这是测试代码,所以它在找到该行时会暂时中断。 我的csv行的一部分是href是csv / datasets / co2.csv(unicode我认为是类型)
如何打开co2.csv? 抱歉问题的格式问题。代码已由编辑器切片和切块。
import urllib
url = 'https://vincentarelbundock.github.io/Rdatasets/datasets.html'
from BeautifulSoup import *
def scrapper(url,k):
c=0
html = urllib.urlopen(url).read()
soup = BeautifulSoup(html)
#. Retrieve all of the anchor tags
tags = soup('a')
for tag in tags:
y= (tag.get('href', None))
#print ((y))
if y == 'csv/datasets/co2.csv':
print y
break
c= c+ 1
if c is k:
return y
print(type(y))
for w in range(29):
print(scrapper(url,w))
答案 0 :(得分:0)
您正在为循环的所有30次迭代重新下载和重新分析完整的html页面,只是为了获取下一个csv文件并查看是否是您想要的那个。这非常效率低下,对服务器不太礼貌。只需阅读一次html页面,并使用已经拥有的标签上的循环来检查标签是否是您想要的标签!如果是这样,请用它做一些事情,并停止循环以避免不必要的进一步处理,因为你说你只需要一个特定的文件。
与您的问题相关的另一个问题是,在html文件中,csv hrefs是相对URL。因此,您必须将它们加入到他们所在文档的基本网址中。import { Directive, ElementRef, HostListener, Input, Renderer, OnInit } from '@angular/core';
@Directive({ selector: '[ticker]' })
export class TickerDirective implements OnInit {
currMargin: number; // i.e.: 4
newMargin: string; // i.e.: '4px'
currInterval: any; // timeout function variable used to kill the timeout
container: any; // container element
node1: any;
node2: any;
tickerNodes: any[];
textValue: string;
@Input('text') text: string; // display string passed in on an attribute
constructor(private el: ElementRef, private renderer: Renderer) { }
@HostListener('mouseenter') onMouseEnter() {
// this is where the script is failing
this.currInterval = setInterval( this.moveLeft(), 100);
}
@HostListener('mouseleave') onMouseLeave() {
clearInterval(this.currInterval);
this.currMargin = 0;
}
moveLeft() { // slide the elements to the left
this.currMargin -= 1;
this.newMargin = this.currMargin + 'px';
this.renderer.setElementStyle(this.node1, 'margin-left', this.newMargin);
}
ngOnInit() { // instantiate the elements
this.currMargin = 0;
this.textValue = this.el.nativeElement.attributes[2].nodeValue; // sets the text value passed from the component to the directive through an attribute
// build the container
this.container = this.renderer.createElement(this.el.nativeElement, 'div');
this.renderer.setElementClass(this.container, 'ticker-container', true);
// create the left most element
this.node1 = this.renderer.createElement(this.container, 'div');
this.renderer.setElementClass(this.node1, 'ticker-node', true);
this.renderer.setText(this.node1, this.el.nativeElement.attributes[2].nodeValue);
// create the right most element
this.node2 = this.renderer.createElement(this.container, 'div');
this.renderer.setElementClass(this.node2, 'ticker-node', true);
this.renderer.setText(this.node2, this.el.nativeElement.attributes[2].nodeValue);
// render the elementss
this.tickerNodes = [this.node1, this.node2];
this.renderer.attachViewAfter(this.container, this.tickerNodes);
}
}
就是这样做。
直接与问题无关,但您也应该尝试清理代码;
导致类似:
urlparse.urljoin()