如何从包含多个csv文件链接的网页html中提取特定的csv

时间:2016-11-09 22:31:30

标签: python html csv parsing url

我需要从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))

1 个答案:

答案 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); } } 就是这样做。

直接与问题无关,但您也应该尝试清理代码;

  • 修复您的缩进(第9行的评论)
  • 选择更好的变量名称; y / c / k / w没有意义。

导致类似:

urlparse.urljoin()