xmstarlet을 사용하여 구문 분석을 위해 html을 수정하거나 형식을 지정하는 방법은 무엇입니까?

xmstarlet을 사용하여 구문 분석을 위해 html을 수정하거나 형식을 지정하는 방법은 무엇입니까?

html먼저 야생에서 이와 같은 것을 실행 해야 합니까 jsoup? 인간의 의미에서 유효하게 만들지 않으면 아마 횡설수설로 바뀔 것입니다. 하지만 최소한 xmlstarlet파일은 처리될 것입니다.

다음과 같이 설치하고 사용할 수 있는 CLI를 찾는 것이 좋습니다.

massage foo.html > bar.xhtml

아니면 적어도 그 라인에 따른 것.

사용 사례:

thufir@doge:~/.html$ 
thufir@doge:~/.html$ curl http://int.soccerway.com/  > soccer.html
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100  188k    0  188k    0     0   313k      0 --:--:-- --:--:-- --:--:--  313k
thufir@doge:~/.html$ 
thufir@doge:~/.html$ xmlstarlet sel -t -v "/html/body/table/tr/td[1]" -n soccer.html 
soccer.html:70.13: xmlParseEntityRef: no name
if (this.$ && this.$.fn && this.$.fn.jquery) {
            ^
soccer.html:70.14: xmlParseEntityRef: no name
if (this.$ && this.$.fn && this.$.fn.jquery) {
             ^
soccer.html:70.26: xmlParseEntityRef: no name
if (this.$ && this.$.fn && this.$.fn.jquery) {
                         ^
soccer.html:70.27: xmlParseEntityRef: no name
if (this.$ && this.$.fn && this.$.fn.jquery) {
                          ^
soccer.html:198.8: Opening and ending tag mismatch: link line 27 and head
</head>
       ^
soccer.html:209.45: EntityRef: expecting ';'
  j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src=
                                            ^
soccer.html:223.40: xmlParseEntityRef: no name
      if (typeof(e.data) === 'string' && (e.data.indexOf('onEplayerVideoStarted'
                                       ^

이상적으로는 URL에 대해 직접 실행되지만 htmlstarlet그러한 조항은 없는 것 같습니다.

거기옵션fo체재, 그러나 위와 다른 결과를 얻을 수는 없습니다.

답변1

테이블의 데이터 셀만 필요한 경우 xmlstarlet fotrailing 을 사용할 수 있습니다 xmlstarlet sel. 당신이 가진 주요 문제는 XPath에 있습니다. 몇 가지 "와일드카드" 요소( )를 추가하면 //원하는 결과를 얻을 수 있습니다.

# fetch URL silently, following redirects, and send to standard out
curl -sL http://int.soccerway.com/                          |

# interpret input as HTML (-H) and try to recover as much as possible (-R)
xmlstarlet fo  -H -R                           2> /dev/null |

# use the following XPath expression and return the value (-t -v), 
# also add a newline after the result (-n)
xmlstarlet sel -t -v '//table//tr//h3/span' -n 2> /dev/null |

# only show the first 10 values
head -n10

산출:

World - Friendlies
Argentina - Prim B Nacional
Australia - National Premier Leagues
Australia - NPL Youth League
Bangladesh - Premier League
Belarus - Premier League
Benin - Championnat National
Brazil - Serie A
Brazil - Serie D
Brazil - Copa Paulista

관련 정보