2014-12-20 2 views
2

Python에서 BeautifulSoup을 사용하여 화면을 스크래핑하는 코드가 생겨 두통을 겪고 있습니다. html에 대한 약간의 변경으로 인해 코드가 손상되었지만 작동하지 않는 이유는 알 수 없습니다. 이것은 기본적으로 구문 분석시에 HTML을 모습의 데모입니다 :find_all이 혼합 된 내용으로 텍스트를 찾지 못합니다.

soup=BeautifulSoup(""" 
<td> 
    <a href="https://alink.com"> 
     Foo Some text Bar 
    </a> 
</td> 
""") 
links = soup.find_all('a',text=re.compile('Some text')) 
links[0]['href'] # => "https://alink.com" 

업그레이드 후, 태그의 몸은 이제 코드 휴식을 만드는 img 태그가 포함되어 있습니다.

<td> 
    <a href="https://alink.com"> 
     <img src="dummy.gif" > 
     Foo Some text Bar 
    </a> 
</td> 

'링크'는 이제 빈 목록이므로 정규식에서 아무 것도 찾을 수 없습니다. 그때 혼자 텍스트에 일치하는 부모를 찾아 주위 해킹,하지만 훨씬 더 깨지기 쉬운 것 같다

links = soup.find_all(text=re.compile('Some text')) 
links[0].parent['href'] # => "https://alink.com" 

이 깨는 텍스트 내용에 형제로 img 태그의 추가 무엇입니까 검색은 BeautifulSoup에 의해 수행되었고, 거기에 첫 번째 코드를 수정하는 방법이 있습니까?

+1

link.text의 "Some text"가 ' –

+0

'인 경우 '다음'(soup.find_all ('a')의 링크에 대한 링크 [ "href"]가 아닌 이유는 무엇입니까? next() 호출은 무엇을합니까? – oligofren

+1

은 원하는 링크가 될 첫 번째 일치 항목을 반환합니다. –

답변

0

첫 번째 예제는 a.stringNone이 아닌 경우, 즉 텍스트가 유일한 자식 인 경우에만 작동합니다. 해결 방법으로

, 당신은 함수 술어를 사용할 수 있습니다

a = soup.find(lambda tag: tag.name == 'a' and tag.has_attr('href') and 'Some text' in tag.text) 
print(a['href']) 
# -> 'https://alink.com' 
1

의 차이는 2 예는 불완전한 img 태그를 가지고 있다는 것입니다 :

이 중

<img src="dummy.gif" /> 
Foo Some text Bar 

되어야한다 또는

<img src="dummy.gif" > </img> 
Foo Some text Bar 

대신,이

<img src="dummy.gif" > 
Foo Some text Bar 
</img> 

으로 분석됩니다 그래서 발견 된 요소는 부모가 a을하지 더 이상 a하지만 img이다.

+0

이 동작은 실제로 라이브러리에만 해당하는 것으로 판명되었습니다. Mac에서 파이썬 배포판으로 작업 할 수있는 구문 분석 코드가 있지만 Linux 배포판에서는 작동하지 않습니다. 불완전한 img 태그는 하나의 런타임에서 부모로 간주되었지만 다른 하나는 형제로 간주되지 않았습니다. 그것을 사랑해야 해. – oligofren

관련 문제