代码之家  ›  专栏  ›  技术社区  ›  Jason Coon

如何使用Python(没有第三方解析器)查找所有大写文本的链接?

  •  0
  • Jason Coon  · 技术社区  · 14 年前

    我在一个简单的函数中使用BeautifulSoup来提取包含所有大写文本的链接:

    def findAllCapsUrls(page_contents):
        """ given HTML, returns a list of URLs that have ALL CAPS text
        """
        soup = BeautifulSoup.BeautifulSoup(page_contents)
        all_urls = node_with_links.findAll(name='a')
    
        # if the text for the link is ALL CAPS then add the link to good_urls
        good_urls = []
        for url in all_urls:
            text = url.find(text=True)
            if text.upper() == text:
                good_urls.append(url['href'])
    
        return good_urls
    

    大多数情况下工作正常,但由于页面上的HTML格式不正确,导致在BeautifulSoup(或lxml,我也尝试过)中有少数页面无法正确解析,从而导致对象中没有(或只有一些)链接。“一把”听起来可能不算什么大不了的,但是这个函数正在爬虫程序中使用,这样爬虫程序就可能永远找不到数百个页面。。。

    如何重构上述函数,使其不使用像BeautifulSoup这样的解析器?我到处寻找如何使用regex实现这一点,但所有的答案都是“使用BeautifulSoup”。或者,我开始研究如何“修复”格式错误的HTML,以便进行解析,但我不认为这是最好的途径。。。

    使用re或其他方法,可以实现上述功能的替代解决方案是什么?

    3 回复  |  直到 14 年前
        1
  •  2
  •   Community rcollyer    7 年前

    如果html页面格式不正确,没有很多解决方案可以真正帮助您。BeautifulSoup或其他解析库是解析html文件的方法。

    regular-expression-to-extract-url-from-an-html-link 使用范围[a-Z]

        2
  •  1
  •   Piotr Czapla    14 年前

    当我需要解析一个真正损坏的html时,速度不是最重要的因素 selenium & webdriver .

    支票 this tutorial 它展示了如何使用webdriver提取google建议(代码是java语言,但可以更改为python)。

        3
  •  0
  •   Jason Coon    14 年前

    我最终得到了regex和BeautifulSoup的组合:

    def findAllCapsUrls2(page_contents):
        """ returns a list of URLs that have ALL CAPS text, given
        the HTML from a page. Uses a combo of RE and BeautifulSoup
        to handle malformed pages.
        """
        # get all anchors on page using regex
        p = r'<a\s+href\s*=\s*"([^"]*)"[^>]*>(.*?(?=</a>))</a>'
        re_urls = re.compile(p, re.DOTALL)
        all_a = re_urls.findall(page_contents)
    
        # if the text for the anchor is ALL CAPS then add the link to good_urls
        good_urls = []
        for a in all_a:
            href = a[0]
            a_content = a[1]
            a_soup = BeautifulSoup.BeautifulSoup(a_content)
            text = ''.join([s.strip() for s in a_soup.findAll(text=True) if s])
            if text and text.upper() == text:
                good_urls.append(href)
    
        return good_urls
    

    到目前为止,这对我的用例是有效的,但我不能保证它在所有页面上都有效。另外,我只在原始函数失败时使用这个函数。