我正在编写一个脚本来阅读网页,并构建一个符合特定条件的链接数据库。现在我坚持使用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')
答案 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