Python lxml / beautiful soup查找网页上的所有链接

时间:2011-05-25 21:20:56

标签: python lxml

我正在编写一个脚本来阅读网页,并构建一个符合特定条件的链接数据库。现在我坚持使用lxml,并了解如何从html中获取所有<a href> ...

result = self._openurl(self.mainurl)
content = result.read()
html = lxml.html.fromstring(content)
print lxml.html.find_rel_links(html,'href')

4 个答案:

答案 0 :(得分:11)

使用XPath。像(不能从这里测试)的东西:

urls = html.xpath('//a/@href')

答案 1 :(得分:4)

使用iterlinks,lxml为此任务提供了出色的功能。

  

这为动作,存档,背景,引用,classid,代码库,数据,href,longdesc,profile,src,usemap,dynsrc中的每个链接[...]产生(元素,属性,链接,pos),或lowsrc属性。

答案 2 :(得分:1)

我想提供一种替代的基于lxml的解决方案。

该解决方案使用lxml.cssselect

中提供的功能
    import urllib
    import lxml.html
    from lxml.cssselect import CSSSelector
    connection = urllib.urlopen('http://www.yourTargetURL/')
    dom =  lxml.html.fromstring(connection.read())
    selAnchor = CSSSelector('a')
    foundElements = selAnchor(dom)
    print [e.get('href') for e in foundElements]

答案 3 :(得分:0)

您可以使用此方法:

from urllib.parse import urljoin, urlparse
from lxml import html as lh
class Crawler:
     def __init__(self, start_url):
         self.start_url = start_url
         self.base_url = f'{urlparse(self.start_url).scheme}://{urlparse(self.start_url).netloc}'
         self.visited_urls = set()

     def fetch_urls(self, html):
         urls = []
         dom = lh.fromstring(html)
         for href in dom.xpath('//a/@href'):
              url = urljoin(self.base_url, href)
              if url not in self.visited_urls and url.startswith(self.base_url):
                   urls.append(url)
         return urls