如何从网站中提取一个元素

时间:2018-07-15 05:05:01

标签: python scrapy

我想从该网站提取联系信息: http://www.smtnet.com/company/index.cfm?fuseaction=view_company&company_id=49509 我已经通过以下代码完成了

from scrapy.selector import Selector
from selenium import webdriver
driver = webdriver.Chrome('D:\chromedriver_win32\chromedriver.exe')
driver.get( "http://www.smtnet.com/company/index.cfm?fuseaction=view_company&company_id=49509")
sel = Selector(text=driver.page_source)
Company_Name = sel.xpath('*//p[1]/strong/text()').extract_first()
Country=sel.xpath('*//p[2]/text()').extract()[-2]
webSite = ????

但是我无法精确定位公司网站,应该是https://www.europlacer.com/

可以告诉我如何提取它吗?

3 个答案:

答案 0 :(得分:1)

如果您只想使用“访问网站”按钮的href属性,请使用以下方法:

Company_URL = sel.xpath("//div[@id = 'tabs-1']/p[3]/a/@href").extract_first()

但是,上面的代码只会返回以下内容:

act_open_company_page.cfm?url_id=70098

由于公司的网址(即'https://www.europlacer.com/')未直接存储在href属性中。 (稍后将使用javascript解决)但是,如果您仔细查看源代码:

<a onclick="return trackOutboundLink('company_url','http://www.europlacer.com','49509');" href="act_open_company_page.cfm?url_id=70098" target="_blank" class=""><img src="/images/buttons/visit-website.jpg" alt="Visit EUROPLACER website" class=""></a>

您可以看到直接URL作为onclick属性中函数的参数存在,因此您需要从那里提取它。首先,要提取onclick属性的值,请执行以下操作:

URL = sel.xpath("//div[@id = 'tabs-1']/p[3]/a/@onclick").extract_first()

然后从中提取所需的URL,如下所示:

URL = URL.split(",")[1]
URL = URL.strip("\'")  // to remove the leading and trailing quotes

提取URL的另一种方法是实际解析href属性的值。您可以看到,当您单击链接时,它变为:

http://www.smtnet.com/company/act_open_company_page.cfm?url_id=70098

因此,诀窍是在主机名(“ http://www.smtnet.com”前面加上,加载URL,然后在更改后提取提取的URL。但是我在答案中描述的第一种方法会容易得多。

除了公司名称,我想您应该尝试以下方法:

Company_Name = sel.xpath('//header/h1/text()').extract_first()

因此,以上行仅打印公司名称(即“ EUROPLACER”)。您的代码也会包含一些文本。

答案 1 :(得分:0)

当您检查开发者控制台中的访问网站按钮时,您会看到

<a onclick="return trackOutboundLink('company_url','http://www.europlacer.com','49509');" href="act_open_company_page.cfm?url_id=70098" target="_blank">
    <img src="/images/buttons/visit-website.jpg" alt="Visit EUROPLACER website">
  </a>

您想要获取Anchor元素,并像这样从onclick属性中检索URL

company_link_handler = sel.xpath('//*[@id="tabs-1"]/p[3]/a').attrib.get('onclick')
website = company_link_handler.split(',')[1]

答案 2 :(得分:0)

第一

查找唯一元素:您不能使用CSS类或元素的ID来获取元素,因此必须找到一个唯一元素来帮助您获取目标元素。 img可以为您提供帮助:

enter image description here

因此,您可以这样获得它:

sel.xpath('//img[@src="/images/buttons/visit-website.jpg"]')

第二

获取目标元素:这个独特元素如何为您提供帮助?具有公司URL的元素是其父节点(我们可以通过/..来访问它),我们需要其onclick

sel.xpath('//img[@src="/images/buttons/visit-website.jpg"]/../@onclick')

最后一步

提取所需的文本:您可以使用许多方法和工具,我只测试了regex即可正常工作:

s=sel.xpath('//img[@src="/images/buttons/visit-website.jpg"]/../@onclick').extract_first()
x=re.search("(https?:\/\/(?:www\.|(?!www))[a-zA-Z0-9][a-zA-Z0-9-]+[a-zA-Z0-9]\.[^\s']{2,}|www\.[a-zA-Z0-9][a-zA-Z0-9-]+[a-zA-Z0-9]\.[^\s']{2,}|https?:\/\/(?:www\.|(?!www))[a-zA-Z0-9]\.[^\s']{2,}|www\.[a-zA-Z0-9]\.[^\s']{2,})",s)
result=x.group(0)

请注意,我所做的更改很少,并使用了here中提到的正则表达式模式。不要忘记也导入re软件包。