Python : Web 抓取特定关键字
Python : Web Scraping Specific Keywords
我的问题应该不难回答,我遇到的问题是我不确定如何为特定关键字抓取网站。我对 Python 很陌生。所以我知道我需要添加更多细节,首先我不想做的是使用 Beautiful Soup 或任何这些库,我使用 lxml 和请求,我想做的是要求用户输入网站并一次它提供,向提供的 URL 发送请求,一旦发出请求,我希望它获取所有 html,我相信我已经使用 html.fromstring(site.content)所以所有这些都已经完成 我遇到的问题是我希望它找到任何 link 或以 '.swf' 结尾的文本并将其打印在下面..任何人都知道这样做的任何方法吗?
def ScrapeSwf():
flashSite = raw_input('Please Provide Web URL : ')
print 'Sending Requests...'
flashReq = requests.get(flashSite)
print 'Scraping...'
flashTree = html.fromstring(flashReq.content)
print ' Now i want to search the html for the swf link in the html'
print ' And Display them using print probablly with a while condition'
类似的东西..非常感谢任何帮助
您正在使用 lxhtml
将 HTML 构建到对象模型中,因此您可能希望使用 flashTree.xpath
搜索 DOM 使用 XML 路径语言。在源代码中找到你想要的路径 DOM 然后编写一个提取它的 xpath,你的网络浏览器的开发者工具和 w3schools 可以帮助你。
我个人不会打扰,我只是使用正则表达式 (re.find(pattern, flashReq.content)
) 提取我需要的文本,因为它更快。如果我不知道正则表达式,对它们不满意,或者我想要原始速度,那么我会像这样使用粗略的字符串提取:
start = flashReq.content.find(text_before_it) + len(text_before_it)
end = flashReq.content.find(text_after_it, start)
text_you_want = flashReq.content[start:end]
这是我的尝试:
import requests [1]
response = requests.get(flashSite) [2]
myPage = response.content [3]
for line in myPage.splitlines(): [4]
if '.swf' in line: [5]
start = line.find('http') [6]
end = line.find('.swf') + 4 [7]
print line[start:end] [8]
说明:
1:导入请求模块。我真的想不出一种方法来从 lxml 中获得我需要的东西,所以我只是坚持这个。
2:将 HTTP GET 方法发送到具有 Flash 文件的任何站点
3:将其内容保存到一个变量中
是的,我知道你可以压缩第 2 行和第 3 行,我这样做是因为我觉得它对我来说更有意义。
4:现在逐行遍历代码中的每一行。
5:检查“.swf”是否在该行中
第 6 行到第 8 行演示了 @GazDavidson 在他的回答中提到的字符串切片方法。我在行 7 中添加 4 的原因是因为“.swf”的长度为 4 个字符。
您应该能够(大致)获得为 SWF 文件提供 link 的结果。
我的问题应该不难回答,我遇到的问题是我不确定如何为特定关键字抓取网站。我对 Python 很陌生。所以我知道我需要添加更多细节,首先我不想做的是使用 Beautiful Soup 或任何这些库,我使用 lxml 和请求,我想做的是要求用户输入网站并一次它提供,向提供的 URL 发送请求,一旦发出请求,我希望它获取所有 html,我相信我已经使用 html.fromstring(site.content)所以所有这些都已经完成 我遇到的问题是我希望它找到任何 link 或以 '.swf' 结尾的文本并将其打印在下面..任何人都知道这样做的任何方法吗?
def ScrapeSwf():
flashSite = raw_input('Please Provide Web URL : ')
print 'Sending Requests...'
flashReq = requests.get(flashSite)
print 'Scraping...'
flashTree = html.fromstring(flashReq.content)
print ' Now i want to search the html for the swf link in the html'
print ' And Display them using print probablly with a while condition'
类似的东西..非常感谢任何帮助
您正在使用 lxhtml
将 HTML 构建到对象模型中,因此您可能希望使用 flashTree.xpath
搜索 DOM 使用 XML 路径语言。在源代码中找到你想要的路径 DOM 然后编写一个提取它的 xpath,你的网络浏览器的开发者工具和 w3schools 可以帮助你。
我个人不会打扰,我只是使用正则表达式 (re.find(pattern, flashReq.content)
) 提取我需要的文本,因为它更快。如果我不知道正则表达式,对它们不满意,或者我想要原始速度,那么我会像这样使用粗略的字符串提取:
start = flashReq.content.find(text_before_it) + len(text_before_it)
end = flashReq.content.find(text_after_it, start)
text_you_want = flashReq.content[start:end]
这是我的尝试:
import requests [1]
response = requests.get(flashSite) [2]
myPage = response.content [3]
for line in myPage.splitlines(): [4]
if '.swf' in line: [5]
start = line.find('http') [6]
end = line.find('.swf') + 4 [7]
print line[start:end] [8]
说明:
1:导入请求模块。我真的想不出一种方法来从 lxml 中获得我需要的东西,所以我只是坚持这个。
2:将 HTTP GET 方法发送到具有 Flash 文件的任何站点
3:将其内容保存到一个变量中
是的,我知道你可以压缩第 2 行和第 3 行,我这样做是因为我觉得它对我来说更有意义。
4:现在逐行遍历代码中的每一行。
5:检查“.swf”是否在该行中
第 6 行到第 8 行演示了 @GazDavidson 在他的回答中提到的字符串切片方法。我在行 7 中添加 4 的原因是因为“.swf”的长度为 4 个字符。
您应该能够(大致)获得为 SWF 文件提供 link 的结果。