单击Python BeautifulSoup

时间:2017-08-15 20:56:45

标签: python python-2.7 web-scraping beautifulsoup

所以我是Python的新手(我来自PHP / JavaScript背景),但我只是想编写一个快速脚本来抓取网站和所有子页面以查找所有a标签{{ 1}}属性,计算有多少,然后单击链接。我可以统计所有链接,但我无法弄清楚如何“点击”链接然后返回响应代码。

href

from bs4 import BeautifulSoup import urllib2 import re def getLinks(url): html_page = urllib2.urlopen(url) soup = BeautifulSoup(html_page, "html.parser") links = [] for link in soup.findAll('a', attrs={'href': re.compile("^http://")}): links.append(link.get('href')) return links anchors = getLinks("http://madisonmemorial.org/") # Click on links and return responses countMe = len(anchors) for anchor in anchors: i = getLinks(anchor) countMe += len(i) # Click on links and return responses print countMe 是否可以实现这一点? 此外,我不是在寻找确切的代码,我真正想要的就是在正确的方向上使用函数调用或类似的东西。谢谢!

3 个答案:

答案 0 :(得分:2)

BeautifulSoup仅仅是一个DOM / HTML解析器,它不构成真实的或在您的情况下模拟的浏览器。为此,您可以使用Chrome或Selenium模拟真实的浏览器并自由抓取,这样您就可以处理 Javascript ,但如果不需要,您可以使用广泛使用的浏览器包 requests 以递归方式抓取所有链接:

for link in links:
  body = requests.get(link).text

答案 1 :(得分:1)

Urlopen是针对您的目的的更好解决方案,但是如果您需要单击并与Web上的元素进行交互,建议您使用selenium webdriver。有Java,Python和其他语言的实现。我已经在Java和Python中使用了它,效果很好。您可以无头运行它,从而实际上不会打开浏览器。

pip install selenium

答案 2 :(得分:0)

所以在评论的帮助下,我决定只使用这样的urlopen:

var data = [
    "San Mateo.",
    "San Francisco.",
    "Palo Alto.",
    "Redwood City.",
    "New York.",
    "Boston.",
    "Chicago.",
    "La Jolla.",
    "San Diego.",
    "San Carlos.",
    "San Bruno."
];

exports.handler = function(event, context, callback) {
    var alexa = Alexa.handler(event, context);
    alexa.APP_ID = APP_ID;
    alexa.registerHandlers(handlers);
    alexa.execute();
};

var handlers = {
     'LaunchRequest': function () {
          this.emit('GetNewFactIntent');
     },

     'GetNewFactIntent': function () {
          var cityName = this.event.request.intent.slots.value;
          var factArr = data;

          for(var i = 0; i < factArr.length; i++){
              if(cityName.equals(factArr[i].value)){
                 this.emit(":tell", LYFT_IS_AVALIABLE);
              }
          }

          this.emit(":tell", LYFT_NOT_AVALIABLE);
      }
}

我在if语句

中有自己的参数