2012-12-30 3 views
1

파이썬을 사용하여 아래의 이미지를 기계화하는 방법은 무엇입니까?특정 이름의 이미지를 클릭하십시오.

<a href="..."><img name="next" id="next" src="..."></a> 

클릭하고 싶은 이미지의 이름과 ID를 알고 있습니다. 어떻게 든 부모 링크를 확인하고 클릭해야합니다. 내가 어떻게 할 수있는?

보너스 질문 : 이미지가 있는지 여부를 어떻게 확인할 수 있습니까?

+0

이미지는 어디에 배치됩니까? 웹 사이트, GUI 또는 3 위? – Evilunclebill

+0

@Evilunclebill 웹 사이트에서. – yasar

+0

그럼 파이썬에 대한 지식이 웹에서 작동하지 않기 때문에 도와 드릴 수 없습니다 :-) 이것을 살펴보십시오. http://docs.python.org/2/library/htmlparser.html?highlight=html#HTMLParser – Evilunclebill

답변

5

mechanize를 사용하는 대신 bs4 (beautifulsoup 4)를 사용하는 것이 매우 간단합니다. 그것은 find_all 기능을 물론 태그를 찾은 후 .parent보다 아무것도 발생으로 부모 태그를 가져

from bs4 import BeautifulSoup 
import urllib2 
text = urllib2.urlopen("http://yourwebpage.com/").read() 
soup = BeautifulSoup(text) 
img = soup.find_all('img',{'id':'next'}) 
if img: 
    a_tag = img[0].parent 
    href = a_tag.get('href') 
    print href 

은, BS4 매우 간단합니다. find_all 함수가 배열을 반환하므로 나중에 if img:을 수행하는 것이 가장 좋지만이 방법은 웹 사이트에 적용되지 않을 수 있으므로 안전 할 수 있습니다. 아래를 참조하십시오.

편집 : "보너스 질문"을 포함하도록 코드를 변경했습니다. 이는 위에 설명 된 대안입니다.

0

당신의 보너스 질문에 대해 - 나는 BeautifulSoup를 사용하여 img 요소가 작동하는지 확인합니다. urllib을 사용하여 이미지가 있는지 확인할 수 있습니다 (적어도 서버가 전달할지 여부와 상관없이). 그렇지 않으면 오류가 발생합니다.

this thread 또한 내가 대답 한 것보다 더 지능적인 사람이 있는지 확인할 수 있습니다. SpiderMonkey라는 라이브러리와 기계화가 버튼을 클릭 할 수 없다는 점을 설명하는 것 같습니다.

0

글쎄, 나는 그러나 내가 lxml을 사용하여 수행하는 방법을 알고, 기계화를 사용하여 작업을 수행하는 방법을 모르는 : <a href="page2.html"><img name="bla bla" id="next" src="Cat.jpg"></a> :

는 우리의 웹 페이지에이 코드를 가지고 있다고 가정 할 수 있습니다. lxml를 사용하여 우리는이 코드를 작성합니다

마법의 대부분은 당신이 당신이 당신이 a 찾고있는 지정, 당신은 //img[@id="next"] 먼저 찾고있는 이미지를 정의하는 tree.xpath 기능에서 발생
from lxml import html 
page = urlllib2.urlopen('http://example.com') 
tree = html.fromstring(page.read()) 
link = tree.xpath('//img[@id="next"]/ancestor::a/attribute::href') 

태그 바로 앞에 : /ancestor::a이고 href 속성 (구체적으로는 /attribute::href)을 찾으려는 것입니다. 링크 변수에는 해당 검색어와 일치하는 문자열 목록이 포함됩니다.이 경우 link [0]은 page2.html이 될 수 있으며 urlopen() 일 수 있습니다. 따라서 클릭하면됩니다.

//img[@id="next"]의 경우, 당신은 예를 들어이 들어, 다른 속성을 사용할 수 있습니다 : //img[@name="bla bla"]와 완벽하게 잘 작동하는 것입니다. 이 상황에 어떤 속성이 더 좋은지 생각할 필요가 있습니다.

나는이 답변이 Mechanize를 사용하지 않는다는 것을 알고 있지만, 유용한 포인터라고 생각합니다. 행운을 빕니다!

관련 문제