2016-07-15 2 views
0

나는 아름다운 soup.I의 도움으로 웹 크롤러를 프로그래밍하고 다음과 같은 아름다운 수프 찾기 문자열과 추출물 다음 HTML 코드가 있습니다파이썬 문자열

<tr class="odd-row"> 
     <td>xyz</td> 
     <td class="numeric">5,00%</td>  
    </tr> 
<tr class="even-row"> 
     <td>abc</td> 
     <td class="numeric">50,00%</td      
    </tr> 
<tr class="odd-row"> 
     <td>ghf</td> 
     <td class="numeric">2,50%</td> 

내 목표는 수업 후 번호를 작성하는 것입니다을 = " 숫자 "를 특정 변수에 지정합니다. class 문 위의 문자열 (예 : "xyz", "abc", ...)에서 조건부로이 작업을 수행하려고합니다.

순간에 나는 다음을 수행 오전 :

for c in soup.find_all("a", string=re.compile('abc')): 
    abc=c.string 

그러나 물론 그것이 문자열 "ABC"가 아니라 나중에 태그의 수를 반환합니다. 그래서 기본적으로 내 질문에 문자열을 사전에 클래스 = "숫자"조건부 후 문자열을 adress하는 것입니다.

도움 주셔서 감사합니다. 난 항상 샘플 구조를 따를 것이다 HTML 코드를 가정하면

답변

1

당신은 내가 가정 올바른 TD 당신이 대신에 가지고 무엇을 의미하는지 찾을 일단 다음 원하는 클래스 다음 형제 얻을 :

h = """<tr class="odd-row"> 
     <td>xyz</td> 
     <td class="numeric">5,00%</td> 
    </tr> 
<tr class="even-row"> 
     <td>abc</td> 
     <td class="numeric">50,00%</td 
    </tr> 
<tr class="odd-row"> 
     <td>ghf</td> 
     <td class="numeric">2,50%</td>""" 


from bs4 import BeautifulSoup 

soup = BeautifulSoup(h) 

for td in soup.find_all("td",text="abc"): 
    print(td.find_next_sibling("td",class_="numeric")) 

경우]를

for td in soup.find_all("td",text="abc"): 
    print(td.find_next_sibling()) 
: 숫자 TD 다음 방금 find_next_sibling()를 호출 할 수 있습니다 항상

입력에 대해 다음과 같이 입력하십시오.

td class="numeric">50,00%</td> 
+0

감사합니다! 이것은 완벽하게 작동하고 정확히 내가 원했던 것입니다! – Tessa

0

내가 제대로 질문을 이해한다면, 당신은이 작업을 수행 할 수 있습니다

result = {} 
table_rows = soup.find_all("tr") 
for row in table_rows: 
    table_columns = row.find_all("td") 
    result[table_columns[0].text] = tds[1].text 
print result #### {u'xyz': u'2,50%', u'abc': u'2,50%', u'ghf': u'2,50%'} 

당신은 키 이름이 'XYZ'입니다 함께 결국 사전을 가지고 , 'abc'.. 등의 값이며 문자열의 값은 class="numeric"

0

('xyz', '5,00 %'), ('abc') 등의 튜플을 반복하고 싶습니다. , '50, 00 % '), ('ghf ','2,50 % '). 그 맞습니까?

그러나 나는 <a> 태그를 검색하므로 코드 결과가 어떻게 생성되는지 이해할 수 없습니다.

대신 <tr> 태그를 반복하고 <td> 태그 내부의 문자열을 가져와야합니다. 첫 번째 next_sibling은 두 태그 사이의 공백을 참조하기 때문에 두 번째 <td>에 액세스하기 위해 두 배의 next_sibling이 표시됩니다.

html = """ 
<tr class="odd-row"> 
    <td>xyz</td> 
    <td class="numeric">5,00%</td>  
</tr> 
<tr class="even-row"> 
    <td>abc</td> 
    <td class="numeric">50,00%</td      
</tr> 
<tr class="odd-row"> 
    <td>ghf</td> 
    <td class="numeric">2,50%</td> 
</tr> 
""" 

from bs4 import BeautifulSoup 
soup = BeautifulSoup(html, 'html.parser') 

for tr in soup.find_all("tr"): 
    print((tr.td.string, tr.td.next_sibling.next_sibling.string))