【问题标题】:Python lxml/beautiful soup to find all links on a web pagePython lxml/beautiful soup查找网页上的所有链接
【发布时间】:2011-05-25 21:20:55
【问题描述】:

我正在编写一个脚本来读取网页,并建立一个符合特定条件的链接数据库。现在我被 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')

【问题讨论】:

标签: python lxml


【解决方案1】:

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

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

【讨论】:

  • 好的,那么我怎样才能从字符串中取回 2 个变量,例如:
  • domain.org/blah/">Economic & Name
  • 我需要网址和说明
  • 使用 html.xpath('//a') 代替,然后(在我的脑海中).attr['href'] 用于 url,.text 用于内容。
  • 在哪里可以阅读更多内容?你怎么知道 xpath 的字段?阅读w3schools.com/xpath/xpath_syntax.asp
  • 这将仅从<a>s 中提取hrefs。 Iorien's solution 更笼统。
  • 【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

      我想提供另一种基于 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]
      

      【讨论】:

      • 喜欢这个答案,现在我可以使用我的 css/js 知识来查找元素。对于其他人,请注意您现在必须单独安装它,但是导入工作如上:lxml.de/cssselect.html
      【解决方案4】:

      你可以用这个方法:

      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
      

      【讨论】:

        猜你喜欢
        相关资源
        最近更新 更多
        热门标签