【问题标题】:retrieving just the title of a webpage in python仅在python中检索网页的标题
【发布时间】:2011-08-23 00:54:12
【问题描述】:

我有超过 5000 个网页,我想要所有这些网页的标题。在我的项目中,我正在使用这样的 BeautifulSoup html 解析器。

soup = BeautifulSoup(open(url).read())
soup('title')[0].string

但它需要很多时间。只是为了一个网页的标题,我正在阅读整个文件并构建解析树(我认为这是延迟的原因,如果我错了,请纠正我)。

在python中有没有其他简单的方法可以做到这一点。

【问题讨论】:

  • 你试过lxml.html吗?它比 bs 快

标签: python html beautifulsoup


【解决方案1】:

试试

>> hearders = {'headers':'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:51.0) Gecko/20100101 Firefox/51.0'}
>>> n = requests.get('http://www.imdb.com/title/tt0108778/', headers=hearders)
>>> al = n.text
>>> al[al.find('<title>') + 7 : al.find('</title>')]
u'Friends (TV Series 1994\u20132004) - IMDb' 

【讨论】:

    【解决方案2】:

    如果你只使用一个简单的正则表达式肯定会更快,BeautifulSoup 很慢。你可以这样做:

    import re
    regex = re.compile('<title>(.*?)</title>', re.IGNORECASE|re.DOTALL)
    regex.search(string_to_search).group(1)
    

    【讨论】:

    • 你应该限制通配符.*?|re.DOTALL,所以.匹配换行符。
    • 你不能以迭代的方式阅读网页,一旦找到标题就停止吗?当只需要标题时,似乎可以可靠地跳过任何网站的几乎所有内容。
    【解决方案3】:

    您甚至可以使用简单的string methods

    html = '<html> lots of crap <title>Title</title> even more crap </html>'
    start = html.find('<title>') + 7 # Add length of <title> tag
    end = html.find('</title>', start)
    title = html[start:end]
    

    但是,这只能保证 &lt;title&gt; 在页面中位于 &lt;/title&gt; 之前。不是在&lt;head&gt; 部分或任何其他地方。

    此外,您应该验证您的假设,即它实际上是 花费大部分时间的 BeautifulSoup 解析。 (我的猜测是open(url).read() 用于 5,000 个资源也需要相当长的时间。无论如何“解析”HTML,你都不会消除这一点。)

    【讨论】:

    • 你不能以迭代的方式阅读网页,一旦找到标题就停止吗?当只需要标题时,似乎可以可靠地跳过任何网站的几乎所有内容。
    【解决方案4】:

    您始终可以使用正则表达式来执行此操作,但如果您获得格式错误的页面,则可能会中断。应该是这样的:

    import re
    titleRE = re.compile("<title>(.+?)</title>")
    title = titleRE.search(s).group(1)
    

    【讨论】:

    • 哦,我没有意识到编译的正则表达式有一个search 方法。好用,一直在传。
    猜你喜欢
    • 2010-09-08
    • 2014-10-19
    • 1970-01-01
    • 2012-02-19
    • 1970-01-01
    • 2022-01-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多