2017-11-03 16 views
0

td 태그 내의 텍스트를 찾으려면 python으로 스크립트를 작성했습니다. next siblingtd 태그이며 CSS 선택기와 함께 BeautifulSoup를 사용합니다. 만약 내가 스크립트를 실행, 나는 그것이 작동 찾으십시오. 그러나, 내가 동일한 라이브러리를 사용하여 lxml을 사용하면 더 이상 작동하지 않습니다. 후자의 스크립트를 어떻게 작동시킬 수 있습니까? 감사. BS4 하나의 작업선택기를 사용하여 특정 텍스트를 찾는 방법은 무엇입니까?

html_content=""" 
<tr> 
    <td width="25%" valign="top" bgcolor="lightgrey" nowrap=""> 
     <font face="Arial" size="-1" color="224119"> 
     <b>Owner Address&nbsp;</b> 
     </font> 
    </td> 
    <td width="75%" valign="top" nowrap=""> 
     <font face="Arial" size="-1" color="black"> 
     1698 EIDER DOWN DR<br>SUMMERVILLE&nbsp;SC&nbsp;29483 
     </font> 
    </td> 
</tr> 
""" 

:

콘텐츠입니다

from bs4 import BeautifulSoup 
soup = BeautifulSoup(html_content,"lxml") 
item = soup.select("td")[0].find_next_sibling().text 
print(item) 

결과 :

from lxml.html import fromstring 
root = fromstring(html_content) 
item = root.cssselect("td b:contains('Address')")[0].text 
print(item) 
:

1698 EIDER DOWN DRSUMMERVILLE SC 29483 

아래의 스크립트는 주소 문자열을 찾을 수 있습니다

는 결과 :

from lxml.html import fromstring 
root = fromstring(html_content) 
item = root.cssselect("td b:contains('Owner Address')+td")[0].text 
print(item) 

결과 :

Traceback (most recent call last): 
    File "C:\Users\ar\AppData\Local\Programs\Python\Python35-32\new_line_one.py", line 28, in <module> 
    item = root.cssselect("td b:contains('Owner Address')+td")[0].text 
IndexError: list index out of range 
는 다음 형제를 찾을 때

Owner Address 

그것은 작동하지 않습니다 (다음 형제를 찾으려면 "+"기호를 적용

다음 형제를 찾으려면 어떻게해야합니까? Btw, 난 단지 xss가 아닌 CSS 선택기입니다. 감사. CSS3의 선택 docs에서

답변

0

:

8.3.1. 인접한 형제 연결자

인접한 형제 연결자는 두 개의 단순 선택자 시퀀스를 구분하는 "더하기 부호"(U + 002B, +) 문자로 만듭니다. 두 시퀀스에 의해 표현 된 요소는 문서 트리에서 동일한 부모를 공유하며 첫 번째 시퀀스 에 의해 표현 된 요소는 두 번째 시퀀스에 의해 표현 된 요소 바로 앞에 위치합니다. 당신의 선택 td b:contains('Owner Address')+td 의미

, 당신은 '주소'를 포함하고 다른 td의 자녀 인 b와 같은 부모를 가진 td을 요구하고 있습니다. 이 노드는 존재하지 않습니다. 이를 작동 시키려면 b 노드가 아닌 td과 일치하는 부분 선택기가 첫 번째인지 확인해야합니다. 그들은 서로를 포함하기 때문에, 다음 일 것입니다 :

td:contains('Owner Address') + td 

td 더 텍스트 (만 자식 노드)을주지 않습니다, 그래서 당신의 조각 만 인쇄의 공백 위에서.

+0

올바른 방향으로 나를 안내해 주셔서 감사합니다. 대신 root.cssselect ("td : contains ('Owner Address') + td") [0] .text_content()'를 사용할 수 있습니다. – SIM