8

是否可以仅获取特定的 URL?

像:

<a href="http://www.iwashere.com/washere.html">next</a>
<span class="class">...</span>
<a href="http://www.heelo.com/hello.html">next</a>
<span class="class">...</span>
<a href="http://www.iwashere.com/wasnot.html">next</a>
<span class="class">...</span>

输出应该只是来自的 URLhttp://www.iwashere.com/

比如,输出 URL:

http://www.iwashere.com/washere.html
http://www.iwashere.com/wasnot.html

我是通过字符串逻辑做到的。有没有使用 BeautifulSoup 的直接方法?

4

3 回答 3

17

您可以匹配多个方面,包括对属性值使用正则表达式:

import re
soup.find_all('a', href=re.compile('http://www\.iwashere\.com/'))

匹配(对于您的示例):

[<a href="http://www.iwashere.com/washere.html">next</a>, <a href="http://www.iwashere.com/wasnot.html">next</a>]

因此,任何具有以字符串开头的值<a>的属性的标记。hrefhttp://www.iwashere.com/

您可以遍历结果并仅选择href属性:

>>> for elem in soup.find_all('a', href=re.compile('http://www\.iwashere\.com/')):
...     print elem['href']
... 
http://www.iwashere.com/washere.html
http://www.iwashere.com/wasnot.html

要改为匹配所有相对路径,请使用否定前瞻断言来测试该值是否以模式(例如http:or mailto:)或双斜杠 ( //hostname/path) 开头;任何此类值都必须是相对路径:

soup.find_all('a', href=re.compile(r'^(?!(?:[a-zA-Z][a-zA-Z0-9+.-]*:|//))'))
于 2013-03-09T16:54:37.097 回答
6

如果您使用BeautifulSoup 4.0.0或更高版本:

soup.select('a[href^="http://www.iwashere.com/"]')
于 2013-03-10T15:12:57.760 回答
0

您可以通过gazpacho中的部分匹配来解决此问题:

输入:

html = """\
<a href="http://www.iwashere.com/washere.html">next</a>
<span class="class">...</span>
<a href="http://www.heelo.com/hello.html">next</a>
<span class="class">...</span>
<a href="http://www.iwashere.com/wasnot.html">next</a>
<span class="class">...</span>
"""

代码:

from gazpacho import Soup

soup = Soup(html)
links = soup.find('a', {'href': "http://www.iwashere.com/"}, partial=True)
[link.attrs['href'] for link in links]

这将输出:

# ['http://www.iwashere.com/washere.html', 'http://www.iwashere.com/wasnot.html']
于 2020-10-09T22:40:40.747 回答