【问题标题】:Extract URLs from specific tags in python从python中的特定标签中提取URL
【发布时间】:2011-06-05 14:54:37
【问题描述】:

全部。 我有一个巨大的 html 文件,其中包含如下标签:

<h3 class="r">
<a href="http://en.wikipedia.org/wiki/Digital_Signature_Algorithm" class=l onmousedown="return clk(this.href,'','','','6','','0CDEQFjACOAM')">

我需要用python从这个页面中提取所有的url。

在循环中:

  1. 一一查找&lt;h3 class="r"&gt;的出现。

  2. 提取网址

http://xrayoptics.by.ru/database/misc/goog2text.py我需要重新编写这个脚本来提取在google上找到的所有链接。

我怎样才能做到这一点? 谢谢。

【问题讨论】:

  • 如果你现在说这是解析谷歌搜索结果,我会使用谷歌的custom search api。是的,你每天只能免费做大约 100 个,但如果谷歌检测到你正在自动查询它们,谷歌也会要求你输入验证码。

标签: python url tags extract


【解决方案1】:
from BeautifulSoup import BeautifulSoup

html = """<html>
...
<h3 class="r">
<a href="http://en.wikipedia.org/wiki/Digital_Signature_Algorithm" class=l
   onmousedown="return clk(this.href,'','','','6','','0CDEQFjACOAM')">
text</a>
</h3>
...
<h3>Don't find me!</h3>
<h3 class="r"><a>Don't find me!</a></h3>
<h3 class="r"><a class="l">Don't error on missing href!</a></h3>
...
</html>
"""
soup = BeautifulSoup(html)

for h3 in soup.findAll("h3", {"class": "r"}):
  for a in h3.findAll("a", {"class": "l", "href": True}):
    print a["href"]

【讨论】:

    【解决方案2】:

    我会使用 XPATH,请参阅 here 了解 Python 中适合使用什么包的问题。

    【讨论】:

    • 只是好奇为什么 XPATH 优于 BeautifulSoup?我从未使用过 XPATH,但根据 OP 的问题,BeautifulSoup 似乎是 HTML/XML 解析的标准答案。
    • 我倾向于使用更严格的格式,并且更喜欢更简单的错误。如果 HTML 不可信,BeautifulSoup 确实可能是一个更好的答案,但我仍然会因为 XPath 的可移植性而受到诱惑。
    • 谢谢,我得看看 XPATH。
    【解决方案3】:

    您可以为此使用正则表达式 (RegEx)。 此 RegEx 将捕获所有以 http 开头并被引号 (") 包围的 URL:

    http([^\"]+)
    

    这就是它在 Python 中的实现方式:

    import re
    myRegEx = re.compile("http([^\"]+)")
    myResults = MyRegEx.search('<source>')
    

    替换为存储要搜索 URL 的源代码的变量。

    myResults.start()myResults.end() 现在包含 URL 的开始和结束位置。使用 myResults.group() 函数查找与 RegEx 匹配的字符串。

    如果还有什么不清楚的,尽管问。

    【讨论】:

    • 嗯,该页面属于谷歌查询。我需要实现的是我想从谷歌搜索中提取所有网站的链接。好吧,看看那个代码:xrayoptics.by.ru/database/misc/goog2text.py也许你可以重写这个?这对你来说会更容易:)
    • @RobinJ 这实际上并没有解决 OP 的问题。 OP 请求了&lt;H3&gt; 标签内的链接。
    • 你试过我的建议了吗?我知道一点Python,但我自己不是那么好。到目前为止,我实现的最复杂的事情是在其中制作一个 IRC 机器人,大约 5 分钟后崩溃。正则表达式对我来说似乎是最简单的解决方案。 @KyloWpppd:我的错,我忘了。如果找不到的话,我会去看看。
    • 正则表达式是最脆弱的解决方案。充其量,它们通常在有限的 html 子集上工作,最坏的情况是,您的正则表达式会变成页面长且极其笨重。对 HTML/XML 和正则表达式进行快速 SO 搜索,您会发现在保存非常特殊的情况时通常会不赞成。
    • 我找到的最佳解决方案是找到

      标签之间的任何内容,然后应用我上面建议的 RegEx。