2017-12-21 40 views
1

<br>, <br/>을 줄 바꿈으로 xpath normalize-space()을 html로 호출 할 수 있습니까? XPath 버전은 1.0입니다.XPath는 요소의 문자열 값을 선택하지만 <br/>은 줄 바꿈으로 바뀌 었습니까?

웹 사이트의 기사를 구문 분석합니다. 실제 HTML 코드 예제 :

<div id="someid"> 
    <img src="https://habrastorage.org/webt/ej/ye/hp/ejyehp08ercmqzlhzh3um6mtukm.jpeg"><br> 
    <br> 
    Организовать удаленный доступ для сотрудников — задача прикладная. Решений на рынке немало, при этом, и подводных камней достаточно. Под катом рассказ о нашем «чемодане», который раскладывается быстро и удобно за 30 минут. Просьба не воспринимать это как рекламный BS, поскольку внутри реальная инструкция по применению.<a name="habracut"></a><br> 
    <br> 
    <a href="https://www.parallels.com/ru/products/ras/remote-application-server/">Parallels Remote Application Server</a> (RAS) — это комплексное средство для доставки виртуальных приложений и рабочих столов, позволяющее работать с приложениями и данными с любого устройства, в том числе мобильного. Мы понимаем, что такие решения хочется сначала протестировать в конкретных условиях, прежде чем принимать решение о покупке.  <br> 
    <br> 
</div> 

사이트에서 텍스트를 추출하는 데 문제가 없습니다. 문제는 normalize-space이 모두 제거됨을 의미하며 모든 태그는 <br>을 포함합니다. 결과적으로 한 개의 긴 텍스트 행이 생깁니다. 나는 휴식과 텍스트 줄이 필요합니다.

예상 결과 :

Организовать удаленный доступ для сотрудников — задача прикладная. Решений на рынке немало, при этом, и подводных камней достаточно. Под катом рассказ о нашем «чемодане», который раскладывается быстро и удобно за 30 минут. Просьба не воспринимать это как рекламный BS, поскольку внутри реальная инструкция по применению. 

Parallels Remote Application Server(RAS) — это комплексное средство для доставки виртуальных приложений и рабочих столов, позволяющее работать с приложениями и данными с любого устройства, в том числе мобильного. Мы понимаем, что такие решения хочется сначала протестировать в конкретных условиях, прежде чем принимать решение о покупке. 
+1

1) 'normalize-space()'를 사용하려는 특별한 이유가 있습니까? 2) 2 개의 부분 문자열을 단일 문자열 또는 2 개의 문자열 목록으로 가져 오시겠습니까? 3) XPath를 공유하십시오 – Andersson

+0

@Andersson 1) HTML 태그가없고 중단 점이있는 텍스트가 필요합니다. 2) 우리는 1 ~ ∞
태그를 가질 수 있습니다. 우리는 기사를 크롤링합니다. –

+0

혼합 된 콘텐츠에서 'br'만이 유일한 요소 유형이라고 확신합니까? – kjhughes

답변

1

이 XPath는 2.0 표현,

string-join(
for $n in (//div[@id="someid"]//node()[self::br or self::text()]) 
    return if (name($n)='br') 
      then codepoints-to-string(10) 
      else $n, '') 

은 줄 바꿈 모든 br 요소를 교체 대상 div의 모든 텍스트 노드 하위 문자열을 결합합니다.

+0

xpath 버전을 확인했으며 1.0입니다. xpath 1.0에서도 같은 작업을 수행 할 수 있습니까? 어쨌든, 답장을 보내 주셔서 감사합니다. –

+0

내가 대답 할 때 질문에 XPath 2.0 태그가 붙어 있습니다. (이후 편집 된 것입니다.) – kjhughes

+1

XPath 1.0만으로는 순수한 XPath 기반 솔루션을 찾을 수 없을 것으로 생각합니다. 호스팅 언어로 코드를 작성해야합니다. – kjhughes

0

불행히도 xpath를 사용하여이 문제를 해결할 수 없습니다. 이 솔루션은 python (scrapy 프레임 워크)에 적합하지만 알고리즘은 다른 언어에도 동일합니다.

parsed_text = remove_tags(response.xpath(record['xpath_text']).extract_first()) 
text = re.sub(r'\n\s*\n', '\n\n' , parsed_text).strip()